more mods

This commit is contained in:
tangent committed 2026-09-12 07:03:41 -06:00
1 parent cc0fa41e3b
commit bac6ac94a3
1742 files changed
+115814 -1

No files matched your search

File diff suppressed because it is too large. Load diff
+99
View File
@@ -0,0 +1,99 @@
# Everness Mapgen [everness]
Everness is a mapgen, which aims to provide an endless array of
beautiful biomes from the surface lands to the caverns with custom-painted
textures. It creates both a sense of discovery and of danger when one lands in the wrong biome.
It also adds structures, dungeons with loot chests, and custom skyboxes based on the biome.
![screenshot](screenshot.png)
## Features
* supports MineClone2 - see attached `minetest.example.mcl.conf` for best optimized settings (looking for testing and contributors)
* player name tag will hide when sneaking
* item magnet pickup when holding sneak
* granular biome settings
* custom sounds, biomes
* custom textures
* custom biomes and cavern biomes
* custom tools, blocks
* custom skyboxes based on biome
* inlcudes (not for all) e.g. walls, doors, glass, stairs, vines, tools, panes, trees...
* unique set of tools
* pottery
## Biomes
Additionally adds extra biomes to the MT game default biomes:
* Coral Forest
* Coral Forest Dunes
* Coral Forest Ocean
* Coral Forest Deep Ocean
* Coral Forest Under
* Frosted Icesheet
* Frosted Icesheet Ocean
* Frosted Icesheet Under
* Cursed Lands
* Cursed Lands Dunes
* Cursed Lands Swamp
* Cursed Lands Ocean
* Cursed Lands Deep Ocean
* Cursed Lands Under
* Crystal Forest
* Crystal Forest Dunes
* Crystal Forest Shore
* Crystal Forest Ocean
* Crystal Forest Deep Ocean
* Crystal Forest Under
* Bamboo Forest
* Bamboo Forest Under
* Forsaken Desert
* Forsaken Desert Ocean
* Forsaken Desert Under
* Baobab Savanna
* Forsaken Tundra
* Forsaken Tundra Beach
* Forsaken Tundra Ocean
* Forsaken Tundra Under
* Mineral Waters
## Wiki
https://bitbucket.org/minetest_gamers/everness/wiki/Home
## Report Bugs/Suggestions
https://bitbucket.org/minetest_gamers/everness/issues
## Dependencies
- *none*
## Optional Dependencies
- default (MTG)
- xpanes (MTG)
- doors (MTG)
- stairs (MTG)
- walls (MTG)
- x_obsidianmese (for paths)
- x_tumbleweed (adds tumbleweeds to deserts)
- x_farming (bonemeal, recipes...)
- x_clay (mapgen structures, loot chests...)
- mcl_core (MCL)
- mcl_fences (MCL)
- mcl_walls (MCL)
- mcl_stairs (MCL)
- mcl_util (MCL)
- mcl_autogroup (MCL)
- mcl_doors (MCL)
- mcl_mapgen_core (MCL)
## License
see included [LICENSE.txt](LICENSE.txt) file for more info
## Installation
see: https://docs.luanti.org/for-players/installing-mods/
File diff suppressed because it is too large. Load diff
+182
View File
@@ -0,0 +1,182 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
-- how often node timers for plants will tick, +/- some random value
function Everness.tick_bamboo(self, pos)
core.get_node_timer(pos):start(math.random(83, 143))
end
-- how often a growth failure tick is retried (e.g. too dark)
function Everness.tick_bamboo_again(self, pos)
core.get_node_timer(pos):start(math.random(40, 80))
end
--- Rotate placed bamboo based on the stem below/above
function Everness.place_bamboo(self, pos, placer, itemstack, pointed_thing)
local node_under = core.get_node(vector.new(pos.x, pos.y - 1, pos.z))
local node_above = core.get_node(vector.new(pos.x, pos.y + 1, pos.z))
if core.get_item_group(node_under.name, 'bamboo') > 0 then
core.swap_node(pos, { name = itemstack:get_name(), param2 = node_under.param2 })
return
elseif core.get_item_group(node_above.name, 'bamboo') > 0 then
core.swap_node(pos, { name = itemstack:get_name(), param2 = node_above.param2 })
return
end
local rand_color = math.random(0, 7) * 32
local rand_param2 = rand_color + math.random(0, 3)
core.swap_node(pos, { name = itemstack:get_name(), param2 = rand_param2 })
end
--- Dig bamboo all the way up and simulate digging particles
function Everness.dig_up_bamboo(self, pos, oldnode, oldmetadata, digger)
if digger == nil then
return
end
local pos_above = { x = pos.x, y = pos.y + 1, z = pos.z }
local pos_below = { x = pos.x, y = pos.y - 1, z = pos.z }
local node_above = core.get_node(pos_above)
local node_below = core.get_node(pos_below)
if core.get_item_group(node_below.name, 'bamboo') > 0 then
self:tick_bamboo(pos_below)
end
if core.get_item_group(node_above.name, 'bamboo') > 0 then
core.node_dig(pos_above, node_above, digger)
core.add_particlespawner({
amount = 10,
time = 0.5,
minpos = { x = pos_above.x - 0.7, y = pos_above.y, z = pos_above.z - 0.7 },
maxpos = { x = pos_above.x + 0.7, y = pos_above.y + 0.75, z = pos_above.z + 0.7 },
minvel = { x = -0.5, y = -4, z = -0.5 },
maxvel = { x = 0.5, y = -2, z = 0.5 },
minacc = { x = -0.5, y = -4, z = -0.5 },
maxacc = { x = 0.5, y = -2, z = 0.5 },
minexptime = 0.5,
maxexptime = 1,
minsize = 0.5,
maxsize = 1,
collisiondetection = true,
node = { name = node_above.name }
})
end
end
function Everness.grow_bamboo(self, pos, elapsed)
local _pos = vector.new(pos)
_pos.y = _pos.y - 1
-- local name = core.get_node(_pos).name
local node_below = core.get_node(_pos)
local _node = core.get_node(pos)
if core.get_item_group(node_below.name, 'soil') == 0
and core.get_item_group(node_below.name, 'sand') == 0
and core.get_item_group(node_below.name, 'everness_sand') == 0
then
if core.get_item_group(node_below.name, 'bamboo') > 0 then
self:grow_bamboo(_pos, elapsed)
return
end
self:tick_bamboo_again(pos)
return
end
_pos.y = _pos.y + 1
local height = 0
while core.get_item_group(_node.name, 'bamboo') > 0 and height < 16 do
height = height + 1
_pos.y = _pos.y + 1
_node = core.get_node(_pos)
end
-- stop growing - random height between 12 - 16 nodes
if height > 11 and height < 16 then
if math.random(1, 3) == 2 then
return
end
end
if height >= 16 then
return
end
if _node.name ~= 'air' then
self:tick_bamboo_again(_pos)
return
end
if core.get_node_light(_pos) < 9 then
self:tick_bamboo_again(pos)
return
end
local height_offset = height
-- variant appearance for this growth stages
local rand_color = math.random(0, 7) * 32
local rand_param2 = rand_color + math.random(0, 3)
if height < 5 then
local next_plant_schem = self.bamboo.growth_stages[height]
for i, v in ipairs(next_plant_schem) do
local pos_to_swap = vector.new(_pos.x, _pos.y - height_offset, _pos.z)
local node_to_swap = core.get_node(pos_to_swap)
height_offset = height_offset - 1
if i == 1 then
if core.get_item_group(node_to_swap.name, 'seed') == 0 and node_to_swap.name ~= 'air' then
rand_param2 = node_to_swap.param2
end
end
core.set_node(pos_to_swap, { name = v.name, param2 = rand_param2 })
if i == #next_plant_schem then
self:tick_bamboo(_pos)
return
end
end
end
-- grow verically while keeping the top 3 nodes with leaves
local start_pos = vector.new(_pos.x, _pos.y - 3, _pos.z)
local prev_node = core.get_node(vector.new(start_pos.x, start_pos.y - 1, start_pos.z))
core.set_node(start_pos, { name = 'everness:bamboo_3', param2 = prev_node.param2 })
for k, v in ipairs(self.bamboo.top_leaves_schem) do
core.set_node(
vector.new(start_pos.x, start_pos.y + k, start_pos.z),
{ name = v.name, param2 = prev_node.param2 }
)
end
self:tick_bamboo(_pos)
return false
end
+238
View File
@@ -0,0 +1,238 @@
--[[
Authors of original source code
----------------------
Kahrl <kahrl@gmx.net> (LGPLv2.1+)
celeron55, Perttu Ahola <celeron55@gmail.com> (LGPLv2.1+)
Various Luanti developers and contributors (LGPLv2.1+)
Everness. Never ending discovery in Everness mapgen.
Modified by:
Copyright (C) 2025 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.
--]]
-- Load support for MT game translation.
local S = core.get_translator(core.get_current_modname())
core.register_craft({
output = 'everness:bucket_empty 1',
recipe = {
{ 'everness:pyrite_ingot', '', 'everness:pyrite_ingot' },
{ '', 'everness:pyrite_ingot', '' },
}
})
local bucket = {
liquids = {}
}
local function check_protection(pos, name, text)
if core.is_protected(pos, name) then
core.log('action', (name ~= '' and name or 'A mod')
.. ' tried to ' .. text
.. ' at protected position '
.. core.pos_to_string(pos)
.. ' with a bucket')
core.record_protection_violation(pos, name)
return true
end
return false
end
-- Register a new liquid
-- source = name of the source node
-- flowing = name of the flowing node
-- itemname = name of the new bucket item (or nil if liquid is not takeable)
-- inventory_image = texture of the new bucket item (ignored if itemname == nil)
-- name = text description of the bucket item
-- groups = (optional) groups of the bucket item, for example {water_bucket = 1}
-- force_renew = (optional) bool. Force the liquid source to renew if it has a
-- source neighbour, even if defined as 'liquid_renewable = false'.
-- Needed to avoid creating holes in sloping rivers.
-- This function can be called from any mod (that depends on bucket).
function bucket.register_liquid(source, flowing, itemname, inventory_image, name,
groups, force_renew)
bucket.liquids[source] = {
source = source,
flowing = flowing,
itemname = itemname,
force_renew = force_renew,
}
bucket.liquids[flowing] = bucket.liquids[source]
if itemname ~= nil then
Everness:register_craftitem(itemname, {
description = name,
inventory_image = inventory_image,
stack_max = 1,
liquids_pointable = true,
groups = groups,
wield_scale = { x = 2, y = 2, z = 1 },
on_place = function(itemstack, user, pointed_thing)
-- Must be pointing to node
if pointed_thing.type ~= 'node' then
return
end
local node = core.get_node_or_nil(pointed_thing.under)
local ndef = node and core.registered_nodes[node.name]
-- Call on_rightclick if the pointed node defines it
if ndef and ndef.on_rightclick and
not (user and user:is_player() and
user:get_player_control().sneak) then
return ndef.on_rightclick(
pointed_thing.under,
node, user,
itemstack)
end
local lpos
-- Check if pointing to a buildable node
if ndef and ndef.buildable_to then
-- buildable; replace the node
lpos = pointed_thing.under
else
-- not buildable to; place the liquid above
-- check if the node above can be replaced
lpos = pointed_thing.above
node = core.get_node_or_nil(lpos)
local above_ndef = node and core.registered_nodes[node.name]
if not above_ndef or not above_ndef.buildable_to then
-- do not remove the bucket with the liquid
return itemstack
end
end
if check_protection(lpos, user
and user:get_player_name()
or '', 'place '..source) then
return
end
core.set_node(lpos, {name = source})
return ItemStack('everness:bucket_empty')
end
})
end
end
Everness:register_craftitem('everness:bucket_empty', {
description = S('Empty Bucket'),
inventory_image = 'everness_bucket_empty.png',
groups = { tool = 1 },
liquids_pointable = true,
wield_scale = { x = 2, y = 2, z = 1 },
on_use = function(itemstack, user, pointed_thing)
if pointed_thing.type == 'object' then
pointed_thing.ref:punch(user, 1.0, { full_punch_interval=1.0 }, nil)
return user:get_wielded_item()
elseif pointed_thing.type ~= 'node' then
-- do nothing if it's neither object nor node
return
end
-- Check if pointing to a liquid source
local node = core.get_node(pointed_thing.under)
local liquiddef = bucket.liquids[node.name]
local item_count = user:get_wielded_item():get_count()
if liquiddef ~= nil
and liquiddef.itemname ~= nil
and node.name == liquiddef.source
then
if check_protection(pointed_thing.under,
user:get_player_name(),
'take '.. node.name) then
return
end
-- default set to return filled bucket
local giving_back = liquiddef.itemname
-- check if holding more than 1 empty bucket
if item_count > 1 then
-- if space in inventory add filled bucked, otherwise drop as item
local inv = user:get_inventory()
if inv:room_for_item('main', { name = liquiddef.itemname }) then
inv:add_item('main', liquiddef.itemname)
else
local pos = user:get_pos()
pos.y = math.floor(pos.y + 0.5)
core.add_item(pos, liquiddef.itemname)
end
-- set to return empty buckets minus 1
giving_back = 'everness:bucket_empty '.. tostring(item_count - 1)
end
-- force_renew requires a source neighbour
local source_neighbor = false
if liquiddef.force_renew then
source_neighbor = core.find_node_near(pointed_thing.under, 1, liquiddef.source)
end
if not (source_neighbor and liquiddef.force_renew) then
core.add_node(pointed_thing.under, { name = 'air' })
end
return ItemStack(giving_back)
else
-- non-liquid nodes will have their on_punch triggered
local node_def = core.registered_nodes[node.name]
if node_def then
node_def.on_punch(pointed_thing.under, node, user, pointed_thing)
end
return user:get_wielded_item()
end
end,
})
-- Mineral water source is 'liquid_renewable = false' to avoid horizontal spread
-- of water sources in sloping rivers that can cause water to overflow
-- riverbanks and cause floods.
-- River water source is instead made renewable by the 'force renew' option
-- used here.
bucket.register_liquid(
'everness:mineral_water_source',
'everness:mineral_water_flowing',
'everness:bucket_mineral_water',
'everness_bucket_mineral_water.png',
S('Mineral') .. ' ' .. S('Water') .. ' ' .. S('Bucket'),
{ tool = 1, water_bucket = 1 }
)
bucket.register_liquid(
'everness:lava_source',
'everness:lava_flowing',
'everness:bucket_lava',
'everness_bucket_lava.png',
S('Lava Bucket'),
{ tool = 1 }
)
core.register_craft({
type = 'fuel',
recipe = 'everness:bucket_lava',
burntime = 370,
replacements = {{ 'everness:bucket_lava', 'everness:bucket_empty' }},
})
+25
View File
@@ -0,0 +1,25 @@
local S = core.get_translator(core.get_current_modname())
core.register_chatcommand('everness:getbiomename', {
description = S('Get biome name where you are standing.'),
params = '',
privs = { creative = true },
func = function(name, param)
local player = core.get_player_by_name(name)
if not player then
return false, S('This command can only be executed in-game!')
end
local p_pos = player:get_pos()
local biome_data = core.get_biome_data(p_pos)
if not biome_data then
return false
end
local biome_name = core.get_biome_name(biome_data.biome)
core.chat_send_player(name, 'Biome name: ' .. biome_name)
end,
})
+435
View File
@@ -0,0 +1,435 @@
--[[
Everness. Never ending discovery in Everness mapgen.
GNU Lesser General Public License, version 2.1
Copyright (C) 2011-2018 celeron55, Perttu Ahola <celeron55@gmail.com>
Copyright (C) 2011-2018 Various Luanti developers and contributors
Copyright (C) 2022 SaKeL
This program 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 program 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:
https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
--]]
Everness.chest = {}
-- support for MT game translation.
local S = core.get_translator(core.get_current_modname())
function Everness.chest.get_chest_formspec(pos)
local spos = pos.x .. ',' .. pos.y .. ',' .. pos.z
local hotbar_bg = ''
local list_bg = ''
local chest_bg = ''
for i = 0, 7, 1 do
hotbar_bg = hotbar_bg .. 'image[' .. 0 + i .. ', ' .. 4.85 .. ';1,1;everness_chest_ui_bg_hb_slot.png]'
end
for row = 0, 2, 1 do
for i = 0, 7, 1 do
list_bg = list_bg .. 'image[' .. 0 + i .. ',' .. 6.08 + row .. ';1,1;everness_chest_ui_bg_slot.png]'
end
end
for row = 0, 3, 1 do
for i = 0, 7, 1 do
chest_bg = chest_bg .. 'image[' .. 0 + i .. ',' .. 0.3 + row .. ';1,1;everness_chest_ui_bg_slot.png]'
end
end
local formspec =
'size[8,9]' ..
'listcolors[#FFFFFF00;#FFFFFF1A;#5E5957]' ..
'background[5,5;1,1;everness_chest_ui_bg.png;true]' ..
'list[nodemeta:' .. spos .. ';main;0,0.3;8,4;]' ..
'list[current_player;main;0,4.85;8,1;]' ..
'list[current_player;main;0,6.08;8,3;8]' ..
'listring[nodemeta:' .. spos .. ';main]' ..
'listring[current_player;main]' ..
list_bg ..
hotbar_bg ..
chest_bg
return formspec
end
function Everness.chest.chest_lid_obstructed(pos)
local above = { x = pos.x, y = pos.y + 1, z = pos.z }
local def = core.registered_nodes[core.get_node(above).name]
-- allow ladders, signs, wallmounted things and torches to not obstruct
if def and
(def.drawtype == 'airlike' or
def.drawtype == 'signlike' or
def.drawtype == 'torchlike' or
(def.drawtype == 'nodebox' and def.paramtype2 == 'wallmounted'))
then
return false
end
return true
end
function Everness.chest.chest_lid_close(pn)
local chest_open_info = Everness.chest.open_chests[pn]
local pos = chest_open_info.pos
local sound = chest_open_info.sound
local swap = chest_open_info.swap
Everness.chest.open_chests[pn] = nil
for _, v in pairs(Everness.chest.open_chests) do
if v.pos.x == pos.x and v.pos.y == pos.y and v.pos.z == pos.z then
return true
end
end
local node = core.get_node(pos)
core.after(0.2, core.swap_node, pos, { name = swap, param2 = node.param2 })
core.sound_play(sound, { gain = 0.3, pos = pos, max_hear_distance = 10 }, true)
end
Everness.chest.open_chests = {}
core.register_on_player_receive_fields(function(player, formname, fields)
local pn = player:get_player_name()
if formname ~= 'everness:chest' then
if Everness.chest.open_chests[pn] then
Everness.chest.chest_lid_close(pn)
end
return
end
if not (fields.quit and Everness.chest.open_chests[pn]) then
return
end
Everness.chest.chest_lid_close(pn)
return true
end)
core.register_on_leaveplayer(function(player)
local pn = player:get_player_name()
if Everness.chest.open_chests[pn] then
Everness.chest.chest_lid_close(pn)
end
end)
function Everness.chest.register_chest(prefixed_name, d)
local name = prefixed_name:sub(1, 1) == ':' and prefixed_name:sub(2, -1) or prefixed_name
local def = table.copy(d)
def.drawtype = 'mesh'
def.visual = 'mesh'
def.paramtype = 'light'
def.paramtype2 = 'facedir'
def.legacy_facedir_simple = true
def.is_ground_content = false
def.use_texture_alpha = 'clip'
def.backface_culling = false
if def.protected then
-- Locked chest
def.on_construct = function(pos)
local meta = core.get_meta(pos)
meta:set_string('infotext', S('Locked Chest'))
meta:set_string('owner', '')
local inv = meta:get_inventory()
inv:set_size('main', 8 * 4)
end
def.after_place_node = function(pos, placer)
local meta = core.get_meta(pos)
meta:set_string('owner', placer:get_player_name() or '')
meta:set_string('infotext', S('Locked Chest (owned by @1)', meta:get_string('owner')))
end
def.can_dig = function(pos,player)
local meta = core.get_meta(pos);
local inv = meta:get_inventory()
return inv:is_empty('main') and Everness.can_interact_with_node(player, pos)
end
def.allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
if not Everness.can_interact_with_node(player, pos) then
return 0
end
return count
end
def.allow_metadata_inventory_put = function(pos, listname, index, stack, player)
if not Everness.can_interact_with_node(player, pos) then
return 0
end
return stack:get_count()
end
def.allow_metadata_inventory_take = function(pos, listname, index, stack, player)
if not Everness.can_interact_with_node(player, pos) then
return 0
end
return stack:get_count()
end
def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
if not Everness.can_interact_with_node(clicker, pos) then
return itemstack
end
local cn = clicker:get_player_name()
if Everness.chest.open_chests[cn] then
Everness.chest.chest_lid_close(cn)
end
core.sound_play(def.sound_open, { gain = 0.3, pos = pos, max_hear_distance = 10 }, true)
if not Everness.chest.chest_lid_obstructed(pos) then
core.swap_node(pos, { name = name .. '_open', param2 = node.param2 })
end
core.after(
0.2,
core.show_formspec,
cn,
'everness:chest',
Everness.chest.get_chest_formspec(pos)
)
Everness.chest.open_chests[cn] = { pos = pos, sound = def.sound_close, swap = name }
end
def.on_blast = function() end
def.on_key_use = function(pos, player)
local secret = core.get_meta(pos):get_string('key_lock_secret')
local itemstack = player:get_wielded_item()
local key_meta = itemstack:get_meta()
if itemstack:get_metadata() == '' then
return
end
if key_meta:get_string('secret') == '' then
key_meta:set_string('secret', core.parse_json(itemstack:get_metadata()).secret)
itemstack:set_metadata('')
end
if secret ~= key_meta:get_string('secret') then
return
end
core.show_formspec(
player:get_player_name(),
'everness:chest_locked',
Everness.chest.get_chest_formspec(pos)
)
end
def.on_skeleton_key_use = function(pos, player, newsecret)
local meta = core.get_meta(pos)
local owner = meta:get_string('owner')
local pn = player:get_player_name()
-- verify placer is owner of lockable chest
if owner ~= pn then
core.record_protection_violation(pos, pn)
core.chat_send_player(pn, S('You do not own this chest.'))
return nil
end
local secret = meta:get_string('key_lock_secret')
if secret == '' then
secret = newsecret
meta:set_string('key_lock_secret', secret)
end
return secret, S('a locked chest'), owner
end
else
-- Public (unlocked) chest
def.on_construct = function(pos)
local meta = core.get_meta(pos)
meta:set_string('infotext', S('Chest'))
local inv = meta:get_inventory()
inv:set_size('main', 8 * 4)
end
def.can_dig = function(pos,player)
local meta = core.get_meta(pos);
local inv = meta:get_inventory()
return inv:is_empty('main')
end
def.on_rightclick = function(pos, node, clicker)
core.sound_play(def.sound_open, { gain = 0.3, pos = pos, max_hear_distance = 10 }, true)
if not Everness.chest.chest_lid_obstructed(pos) then
core.swap_node(pos, { name = name .. '_open', param2 = node.param2 })
end
core.after(0.2, core.show_formspec, clicker:get_player_name(), 'everness:chest', Everness.chest.get_chest_formspec(pos))
Everness.chest.open_chests[clicker:get_player_name()] = { pos = pos, sound = def.sound_close, swap = name }
end
def.on_blast = function(pos)
local drops = {}
Everness.get_inventory_drops(pos, 'main', drops)
drops[#drops + 1] = name
core.remove_node(pos)
return drops
end
end
Everness.set_inventory_action_loggers(def, 'chest')
local def_opened = table.copy(def)
local def_closed = table.copy(def)
if def.protected then
def_opened.mesh = 'everness_chest_protected_opened.obj'
def_opened.tiles = {
'everness_chest_front.png',
'everness_chest_top.png',
'everness_chest_side.png',
'everness_chest_front.png'
}
def_closed.mesh = 'everness_chest_protected_closed.obj'
def_closed.tiles = {
'everness_chest_front.png',
'everness_chest_top.png',
'everness_chest_side.png',
'everness_chest_front.png'
}
else
def_opened.mesh = 'everness_chest_opened.obj'
def_opened.tiles = {
'everness_chest_front.png',
'everness_chest_top.png',
'everness_chest_side.png'
}
def_closed.mesh = 'everness_chest_closed.obj'
def_closed.tiles = {
'everness_chest_front.png',
'everness_chest_top.png',
'everness_chest_side.png'
}
end
def_opened.drop = name
def_opened.groups.not_in_creative_inventory = 1
def_opened.selection_box = {
type = 'fixed',
fixed = { -1 / 2, -1 / 2, -1 / 2, 1 / 2, 3 / 16, 1 / 2 },
}
def_opened.can_dig = function()
return false
end
def_opened.on_blast = function() end
Everness:register_node(prefixed_name, def_closed)
Everness:register_node(prefixed_name .. '_open', def_opened)
-- close opened chests on load
Everness:register_lbm({
label = 'Everness close opened chests on load',
name = 'everness:close_' .. prefixed_name:gsub(':', '_') .. '_open',
nodenames = { prefixed_name .. '_open' },
run_at_every_load = true,
action = function(pos, node)
node.name = prefixed_name
core.swap_node(pos, node)
end
})
end
Everness.chest.register_chest('everness:chest', {
description = S('Chest'),
sounds = Everness.node_sound_wood_defaults(),
sound_open = 'everness_chest_open',
sound_close = 'everness_chest_close',
groups = {
-- MTG
choppy = 2,
oddly_breakable_by_hand = 2,
-- MCL
handy = 1,
axey = 1,
container = 2,
deco_block = 1,
material_wood = 1,
flammable = -1,
},
_mcl_blast_resistance = 2.5,
_mcl_hardness = 2.5,
})
Everness.chest.register_chest('everness:chest_locked', {
description = S('Locked Chest'),
sounds = Everness.node_sound_wood_defaults(),
sound_open = 'everness_chest_open',
sound_close = 'everness_chest_close',
groups = {
-- MTG
choppy = 2,
oddly_breakable_by_hand = 2,
-- MCL
handy = 1,
axey = 1,
container = 2,
deco_block = 1,
material_wood = 1,
flammable = -1,
},
_mcl_blast_resistance = 2.5,
_mcl_hardness = 2.5,
protected = true
})
core.register_craft({
output = 'everness:chest',
recipe = {
{ 'group:everness_wood', 'group:everness_wood', 'group:everness_wood' },
{ 'group:everness_wood', '', 'group:everness_wood' },
{ 'group:everness_wood', 'group:everness_wood', 'group:everness_wood' },
}
})
minetest.register_craft({
output = 'everness:chest_locked',
recipe = {
{ 'group:everness_wood', 'group:everness_wood', 'group:everness_wood' },
{ 'group:everness_wood', 'everness:pyrite_ingot', 'group:everness_wood' },
{ 'group:everness_wood', 'group:everness_wood', 'group:everness_wood' },
}
})
minetest.register_craft( {
type = 'shapeless',
output = 'everness:chest_locked',
recipe = { 'everness:chest', 'everness:pyrite_ingot' },
})
core.register_craft({
type = 'fuel',
recipe = 'everness:chest',
burntime = 30,
})
core.register_craft({
type = 'fuel',
recipe = 'everness:chest_locked',
burntime = 30,
})
+614
View File
@@ -0,0 +1,614 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--- Single shapeless craft
---@param input_name string
---@param output_name string
local function register_craft_single(input_name, output_name)
core.register_craft({
type = 'shapeless',
output = output_name,
recipe = { input_name }
})
end
--- 2x2 same material shaped craft
---@param input_name string
---@param output_name string
local function register_craft_2x2(input_name, output_name)
core.register_craft({
type = 'shaped',
output = output_name,
recipe = {
{input_name, input_name},
{input_name, input_name},
}
})
end
--- 3x2 same material shaped craft
---@param input_name string
---@param output_name string
local function register_craft_3x2(input_name, output_name)
core.register_craft({
type = 'shaped',
output = output_name,
recipe = {
{input_name, input_name, input_name},
{input_name, input_name, input_name},
}
})
end
--- 3x2 shaped craft, top same material, bottom (different from top) same material
---@param input_top_name string
---@param input_bottom_name string
---@param output_name string
local function register_craft_3x2_composite(input_top_name, input_bottom_name, output_name)
core.register_craft({
type = 'shaped',
output = output_name,
recipe = {
{input_top_name, input_top_name, input_top_name},
{input_bottom_name, input_bottom_name, input_bottom_name},
}
})
end
--- 1x2 shaped craft, top same material, bottom (different from top) same material
---@param input_top_name string
---@param input_bottom_name string
---@param output_name string
local function register_craft_1x2_composite(input_top_name, input_bottom_name, output_name)
core.register_craft({
type = 'shaped',
output = output_name,
recipe = {
{input_top_name},
{input_bottom_name},
}
})
end
--- 1x3 same material shaped craft
---@param input_name string
---@param output_name string
local function register_craft_1x3(input_name, output_name)
core.register_craft({
type = 'shaped',
output = output_name,
recipe = {
{input_name},
{input_name},
{input_name},
}
})
end
--- 2x1 same material shaped craft
---@param input_name string
---@param output_name string
local function register_craft_2x1(input_name, output_name)
core.register_craft({
type = 'shaped',
output = output_name,
recipe = {
{input_name, input_name},
}
})
end
--- 2x1 shaped craft, each material different
---@param input_first_name string
---@param input_second_name string
---@param output_name string
local function register_craft_2x1_composite(input_first_name, input_second_name, output_name)
core.register_craft({
type = 'shaped',
output = output_name,
recipe = {
{input_first_name, input_second_name},
}
})
end
--- 2x3 same material shaped craft
---@param input_name string
---@param output_name string
local function register_craft_2x3(input_name, output_name)
core.register_craft({
type = 'shaped',
output = output_name,
recipe = {
{input_name, input_name},
{input_name, input_name},
{input_name, input_name},
}
})
end
--- 3x1 same material shaped craft
---@param input_name string
---@param output_name string
local function register_craft_3x1(input_name, output_name)
core.register_craft({
type = 'shaped',
output = output_name,
recipe = {
{input_name, input_name, input_name},
}
})
end
--- 3x3 same material shaped craft
---@param input_name string
---@param output_name string
local function register_craft_3x3(input_name, output_name)
core.register_craft({
type = 'shaped',
output = output_name,
recipe = {
{input_name, input_name, input_name},
{input_name, input_name, input_name},
{input_name, input_name, input_name},
}
})
end
--- 'anvil' pattern, same material shaped craft
---@param input_name string
---@param output_name string
local function register_craft_anvil_pattern(input_name, output_name)
core.register_craft({
type = 'shaped',
output = output_name,
recipe = {
{input_name, input_name, input_name},
{'', input_name, ''},
{input_name, input_name, input_name},
}
})
end
--- 'bullseye' pattern, shaped craft, same material around the center, center different material
---@param input_around_name string
---@param input_center_name string
---@param output_name string
local function register_craft_bullseye_pattern(input_around_name, input_center_name, output_name)
core.register_craft({
type = 'shaped',
output = output_name,
recipe = {
{input_around_name, input_around_name, input_around_name},
{input_around_name, input_center_name, input_around_name},
{input_around_name, input_around_name, input_around_name},
}
})
end
--- 'sandwich' pattern, shaped craft, same material top/bottom rows, center row different material
---@param input_around_name string
---@param input_center_name string
---@param output_name string
local function register_craft_sandwich_pattern(input_around_name, input_center_name, output_name)
core.register_craft({
type = 'shaped',
output = output_name,
recipe = {
{input_around_name, input_around_name, input_around_name},
{input_center_name, input_center_name, input_center_name},
{input_around_name, input_around_name, input_around_name},
}
})
end
--- 'pillar top' pattern, same material shaped craft
---@param input_name string
---@param output_name string
local function register_craft_pillar_top(input_name, output_name)
core.register_craft({
type = 'shaped',
output = output_name,
recipe = {
{input_name, input_name, input_name},
{'', input_name, ''},
{'', input_name, ''},
}
})
end
--- 'pillar bottom' pattern, same material shaped craft
---@param input_name string
---@param output_name string
local function register_craft_pillar_bottom(input_name, output_name)
core.register_craft({
type = 'shaped',
output = output_name,
recipe = {
{'', input_name, ''},
{'', input_name, ''},
{input_name, input_name, input_name},
}
})
end
--
-- Default Blocks
--
if core.get_modpath('default') then
register_craft_3x3('default:snowblock', 'everness:snowcobble 9')
register_craft_3x3('default:ice', 'everness:icecobble 9')
register_craft_single('everness:chest', 'default:chest')
elseif core.get_modpath('mcl_core') then
register_craft_3x3('mcl_core:snowblock', 'everness:snowcobble 9')
register_craft_3x3('mcl_core:ice', 'everness:icecobble 9')
register_craft_single('everness:chest', 'mcl_chests:chest')
end
--
-- Cobbles
--
register_craft_3x3('everness:frosted_ice', 'everness:icecobble 9')
register_craft_3x3('everness:frosted_snowblock', 'everness:snowcobble 9')
--
-- Bamboo
--
register_craft_2x2('everness:bamboo_item', 'everness:bamboo_wood')
register_craft_3x3('everness:bamboo_item', 'everness:bamboo_block')
register_craft_2x2('everness:bamboo_wood', 'everness:bamboo_mosaic_wood')
register_craft_3x2('everness:bamboo_wood', 'everness:trapdoor_bamboo 2')
--
-- Ice
--
register_craft_single('everness:frosted_ice', 'everness:frosted_ice_translucent')
register_craft_single('everness:frosted_ice_translucent', 'everness:frosted_ice')
--
-- Trapdoors
--
register_craft_3x2('everness:crystal_wood', 'everness:trapdoor_crystal_wood 2')
register_craft_3x2('everness:dry_wood', 'everness:trapdoor_cursed_wood 2')
register_craft_3x2('everness:lava_tree_wood', 'everness:trapdoor_lava_tree 2')
register_craft_3x2('everness:palm_tree_wood', 'everness:trapdoor_palm_wood 2')
--
-- Pyrite
--
register_craft_3x3('everness:pyrite_ingot', 'everness:pyriteblock')
register_craft_2x2('everness:pyriteblock_forged', 'everness:pyriteblock_brick 4')
register_craft_3x3('everness:pyriteblock_forged', 'everness:pyriteblock_polished 9')
register_craft_2x3('everness:pyriteblock_forged', 'everness:pyrite_roof_tile 6')
register_craft_1x2_composite('group:glass', 'everness:pyrite_ingot', 'everness:pyrite_glass')
if core.get_modpath('default') then
register_craft_1x2_composite('default:glass', 'everness:pyrite_ingot', 'everness:pyrite_glass')
elseif core.get_modpath('mcl_core') then
register_craft_1x2_composite('mcl_core:glass', 'everness:pyrite_ingot', 'everness:pyrite_glass')
end
register_craft_1x2_composite('everness:pyrite_glass', 'everness:pyrite_ingot', 'everness:pyrite_lantern')
register_craft_2x1('everness:pyriteblock_forged', 'everness:pyriteblock_slab_brick 2')
register_craft_bullseye_pattern('everness:pyriteblock_forged', '', 'everness:pyriteblock_spiral 8')
register_craft_pillar_bottom('everness:pyriteblock_forged', 'everness:pyrite_pillar_bottom 5')
register_craft_1x3('everness:pyriteblock_forged', 'everness:pyrite_pillar_middle 3')
register_craft_pillar_top('everness:pyriteblock_forged', 'everness:pyrite_pillar_top 5')
register_craft_anvil_pattern('everness:pyriteblock_forged', 'everness:pyrite_pillar_small 7')
--
-- Glass
--
register_craft_bullseye_pattern('everness:glass', 'everness:bloodspore_plant', 'everness:tinted_glass_red 8')
register_craft_bullseye_pattern('everness:glass', 'everness:bloodspore_plant_small', 'everness:tinted_glass_red 8')
--
-- Tree into wood
--
local recipes_wood = {
{'everness:baobab_tree', 'everness:baobab_wood 4'},
{'everness:coral_tree', 'everness:coral_wood 4'},
{'everness:crystal_tree', 'everness:crystal_wood 4'},
{'everness:dry_tree', 'everness:dry_wood 4'},
{'everness:lava_tree', 'everness:lava_tree_wood 4'},
{'everness:lava_tree_with_lava', 'everness:lava_tree_wood 4'},
{'everness:mese_tree', 'everness:mese_wood 4'},
{'everness:sequoia_tree', 'everness:sequoia_wood 4'},
{'everness:willow_tree', 'everness:willow_wood 4'},
{'everness:palm_tree', 'everness:palm_tree_wood 4'},
}
for _, data in ipairs(recipes_wood) do
register_craft_single(data[1], data[2])
end
--
-- Sand into sandstone
--
local recipes_sandstone = {
{'everness:coral_forest_deep_ocean_sand', 'everness:coral_deep_ocean_sandstone_block 4'},
{'everness:coral_sand', 'everness:coral_sandstone 4'},
{'everness:coral_white_sand', 'everness:coral_white_sandstone 4'},
{'everness:crystal_forest_deep_ocean_sand', 'everness:crystal_forest_deep_ocean_sandstone_block 4'},
{'everness:crystal_sand', 'everness:crystal_sandstone 4'},
{'everness:cursed_lands_deep_ocean_sand', 'everness:cursed_lands_deep_ocean_sandstone_block 4'},
{'everness:cursed_sand', 'everness:cursed_sandstone_block 4'},
{'everness:mineral_sand', 'everness:mineral_sandstone 4'},
}
for _, data in ipairs(recipes_sandstone) do
register_craft_2x2(data[1], data[2])
end
--
-- Stone and bone into brick
--
local recipes_brick = {
{'everness:coral_bones_block', 'everness:coral_bones_brick 4'},
{'everness:coral_deep_ocean_sandstone_block', 'everness:coral_deep_ocean_sandstone_brick 4'},
{'everness:coral_desert_stone', 'everness:coral_desert_stone_brick 4'},
{'everness:coral_sandstone', 'everness:coral_sandstone_brick 4'},
{'everness:coral_white_sandstone', 'everness:coral_white_sandstone_brick 4'},
{'everness:crystal_forest_deep_ocean_sandstone_block', 'everness:crystal_forest_deep_ocean_sandstone_brick 4'},
{'everness:crystal_sandstone', 'everness:crystal_sandstone_brick 4'},
{'everness:cursed_lands_deep_ocean_sandstone_block', 'everness:cursed_lands_deep_ocean_sandstone_brick 4'},
{'everness:cursed_sandstone_block', 'everness:cursed_sandstone_brick 4'},
{'everness:cursed_stone', 'everness:cursed_brick 4'},
{'everness:forsaken_desert_stone', 'everness:forsaken_desert_brick_red 4'},
{'everness:forsaken_tundra_stone', 'everness:forsaken_tundra_brick 4'},
{'everness:mineral_sandstone', 'everness:mineral_sandstone_brick 4'},
{'everness:mineral_stone', 'everness:mineral_stone_brick 4'},
}
for _, data in ipairs(recipes_brick) do
register_craft_2x2(data[1], data[2])
end
--
-- Base materials into blocks
--
register_craft_2x2('everness:quartz_crystal', 'everness:quartz_block 4')
register_craft_3x3('everness:coral_bones', 'everness:coral_bones_block 9')
register_craft_3x3('everness:coral_desert_stone', 'everness:coral_desert_stone_block 9')
register_craft_3x3('everness:crystal_cyan', 'everness:crystal_block_cyan')
register_craft_3x3('everness:crystal_orange', 'everness:crystal_block_orange')
register_craft_3x3('everness:crystal_purple', 'everness:crystal_block_purple')
register_craft_3x3('everness:mineral_sandstone', 'everness:mineral_sandstone_block 9')
register_craft_3x3('everness:mineral_stone', 'everness:mineral_stone_block 9')
--
-- Blocks into base materials
--
register_craft_single('everness:crystal_block_cyan', 'everness:crystal_cyan 9')
register_craft_single('everness:crystal_block_orange', 'everness:crystal_orange 9')
register_craft_single('everness:crystal_block_purple', 'everness:crystal_purple 9')
--
-- Carved and chiseled blocks
--
register_craft_2x2('everness:coral_sandstone_chiseled', 'everness:coral_sandstone_carved_1 9')
register_craft_2x2('everness:quartz_block', 'everness:quartz_chiseled 4')
register_craft_3x3('everness:coral_sandstone', 'everness:coral_sandstone_chiseled 9')
register_craft_3x3('everness:crystal_sandstone', 'everness:crystal_sandstone_chiseled 9')
register_craft_3x3('everness:cursed_brick', 'everness:cursed_brick_carved 9')
register_craft_1x2_composite('everness:forsaken_desert_brick_red', 'everness:forsaken_desert_brick', 'everness:forsaken_desert_chiseled_stone')
--
-- Masonry items
--
register_craft_1x3('everness:coral_white_sandstone', 'everness:coral_white_sandstone_pillar 3')
register_craft_1x3('everness:quartz_block', 'everness:quartz_pillar 3')
register_craft_2x1_composite('everness:cursed_brick', 'group:leaves', 'everness:cursed_brick_with_growth 4')
core.register_craft({
output = 'everness:cursed_brick_mixed 4',
recipe = {
{ 'everness:cursed_stone', 'everness:cursed_brick' },
{ 'everness:cursed_brick', 'everness:cursed_stone' },
}
})
register_craft_2x1_composite('everness:forsaken_desert_cobble_red', 'everness:forsaken_desert_sand', 'everness:forsaken_desert_cobble')
register_craft_2x1_composite('everness:forsaken_desert_brick_red', 'everness:forsaken_desert_sand', 'everness:forsaken_desert_brick')
register_craft_2x2('everness:forsaken_desert_brick', 'everness:forsaken_desert_engraved_stone 4')
--
-- Misc items
--
core.register_craft({
output = 'everness:coral_forest_deep_ocean_lantern 1',
recipe = {
{ 'everness:coral_deep_ocean_sandstone_block', 'group:glass', 'everness:coral_deep_ocean_sandstone_block' },
{ 'group:glass', 'group:torch', 'group:glass' },
{ 'everness:coral_deep_ocean_sandstone_block', 'group:glass', 'everness:coral_deep_ocean_sandstone_block' },
}
})
if core.get_modpath('default') then
core.register_craft({
output = 'everness:coral_forest_deep_ocean_lantern 1',
recipe = {
{ 'everness:coral_deep_ocean_sandstone_block', 'default:glass', 'everness:coral_deep_ocean_sandstone_block' },
{ 'default:glass', 'group:torch', 'default:glass' },
{ 'everness:coral_deep_ocean_sandstone_block', 'default:glass', 'everness:coral_deep_ocean_sandstone_block' },
}
})
elseif core.get_modpath('mcl_core') then
core.register_craft({
output = 'everness:coral_forest_deep_ocean_lantern 1',
recipe = {
{ 'everness:coral_deep_ocean_sandstone_block', 'mcl_core:glass', 'everness:coral_deep_ocean_sandstone_block' },
{ 'mcl_core:glass', 'group:torch', 'mcl_core:glass' },
{ 'everness:coral_deep_ocean_sandstone_block', 'mcl_core:glass', 'everness:coral_deep_ocean_sandstone_block' },
}
})
end
core.register_craft({
output = 'everness:shell_of_underwater_breathing',
recipe = {
{ '', '', 'group:everness_crystal_forest_deep_ocean_coral' },
{ '', 'group:everness_cursed_lands_deep_ocean_coral', '' },
{ 'group:everness_coral_forest_deep_ocean_coral', '', '' },
}
})
register_craft_3x3('everness:mese_tree_fruit', 'default:mese_crystal_fragment')
register_craft_3x1('everness:lotus_leaf_3', 'default:paper')
register_craft_single('everness:mineral_sandstone', 'everness:mineral_sand 4')
register_craft_3x2_composite('everness:mineral_sandstone', 'everness:mineral_sandstone_brick', 'everness:mineral_sandstone_brick_block 6')
register_craft_sandwich_pattern('group:flora', 'everness:mineral_stone_brick', 'everness:mineral_stone_brick_with_growth 3')
register_craft_sandwich_pattern('everness:mineral_stone_brick_with_growth', 'group:flower', 'everness:mineral_stone_brick_with_flower_growth 6')
register_craft_3x2('everness:mineral_sandstone', 'everness:sand_castle_wall 6')
core.register_craft({
output = 'everness:ceramic_pot_blank',
recipe = {
{ '', 'everness:ceramic_pot_sherd_blank', ''},
{ 'everness:ceramic_pot_sherd_blank', '', 'everness:ceramic_pot_sherd_blank'},
{ '', 'everness:ceramic_pot_sherd_blank', ''},
}
})
register_craft_single('everness:ceramic_pot_blank', 'everness:ceramic_pot_sherd_blank 4')
--
-- Tools
--
local recipes_tool = {
{'everness:hammer', {
{ 'group:everness_obsidian', 'group:everness_obsidian', 'group:everness_obsidian' },
{ 'group:everness_obsidian', 'everness:pyriteblock_forged', 'group:everness_obsidian' },
{ '', 'group:stick', '' }
}},
{'everness:hammer_sharp', {
{ 'everness:pyriteblock_forged', 'everness:pyriteblock_forged', 'everness:pyriteblock_forged' },
{ 'everness:pyriteblock_forged', 'everness:hammer', 'everness:pyriteblock_forged' },
{ '', 'everness:hammer', '' }
}},
{'everness:pick_archeological', {
{ 'group:stone', 'group:stone', 'group:stone' },
{ '', 'group:stick', '' },
{ 'group:stick', '', '' }
}},
{'everness:pick_illuminating', {
{ 'everness:crystal_purple', 'everness:coral_tree_bioluminescent', 'everness:crystal_purple' },
{ '', 'everness:sulfur_stone', '' },
{ '', 'group:stick', '' }
}},
{'everness:shovel_silk', {
{ 'everness:ancient_emerald_ice' },
{ 'everness:glowing_pillar' },
{ 'everness:crystal_purple' }
}},
{'everness:vine_shears', {
{ '', 'everness:pyrite_ingot', '' },
{ 'group:stick', 'group:wood', 'everness:pyrite_ingot' },
{ '', '', 'group:stick' }
}},
}
for _, data in ipairs(recipes_tool) do
core.register_craft({
type = 'shaped',
output = data[1],
recipe = data[2]
})
end
--
-- Fuel
--
local recipes_fuel = {
{'everness:baobab_wood', 8},
{'everness:bamboo_block', 15},
{'everness:bamboo_dry_block', 15},
{'everness:bamboo_item', 3},
{'everness:bamboo_mosaic_wood', 15},
{'everness:bamboo_wood', 15},
{'everness:coral_burdock_1', 3},
{'everness:coral_burdock_2', 3},
{'everness:crystal_wood', 15},
{'everness:door_bamboo', 14},
{'everness:lava_tree_wood', 30},
{'everness:lotus_leaf_3', 1},
{'everness:mese_wood', 15},
{'everness:sequoia_wood', 6},
{'everness:sulfur_stone', 370},
{'everness:trapdoor_bamboo', 7},
{'everness:trapdoor_crystal_wood', 7},
}
for _, data in ipairs(recipes_fuel) do
core.register_craft({
type = 'fuel',
recipe = data[1],
burntime = data[2],
})
end
--
-- Cooking recipes
--
local recipes_cooking = {
{'everness:coral_desert_cobble', 'everness:coral_desert_stone'},
{'everness:coral_desert_mossy_cobble', 'everness:coral_desert_stone'},
{'everness:crystal_cobble', 'everness:crystal_stone'},
{'everness:crystal_mossy_cobble', 'everness:crystal_stone'},
{'everness:forsaken_desert_cobble_red', 'everness:forsaken_desert_stone'},
{'everness:forsaken_tundra_cobble', 'everness:forsaken_tundra_stone'},
{'everness:mineral_cave_cobblestone', 'everness:mineral_cave_stone'},
{'everness:mineral_lava_stone_dry', 'everness:mineral_lava_stone'},
{'everness:mineral_stone_cobble', 'everness:mineral_stone'},
--
{'everness:bamboo_block', 'everness:bamboo_dry_block'},
{'everness:baobab_fruit', 'everness:baobab_fruit_roasted'},
{'everness:cursed_stone', 'everness:cursed_stone_carved'},
{'everness:lotus_leaf', 'everness:lotus_leaf_3'},
{'everness:lotus_leaf_2', 'everness:lotus_leaf_3'},
{'everness:pyriteblock', 'everness:pyriteblock_forged'},
{'group:everness_sand', 'everness:glass'},
}
for _, data in ipairs(recipes_cooking) do
core.register_craft({
type = 'cooking',
output = data[2],
recipe = data[1],
})
end
--
-- Saplings
--
register_craft_1x2_composite('group:lantern', 'everness:coral_tree_sapling', 'everness:coral_tree_bioluminescent_sapling')
register_craft_1x2_composite('group:lantern', 'everness:dry_tree_sapling', 'everness:cursed_dream_tree_sapling')
register_craft_2x2('everness:crystal_tree_sapling', 'everness:crystal_tree_large_sapling')
+77
View File
@@ -0,0 +1,77 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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 = core.get_translator(core.get_current_modname())
--
-- Craftitem registry
--
-- Quartz Crystal
Everness:register_craftitem('everness:quartz_crystal', {
description = S('Quartz Crystal'),
inventory_image = 'everness_quartz.png',
})
Everness:register_craftitem('everness:bamboo_item', {
description = S('Bamboo'),
inventory_image = 'everness_bamboo_item.png',
})
Everness:register_craftitem('everness:baobab_fruit_roasted', {
description = S('Baobab Roasted Fruit') .. '\n'.. core.colorize(Everness.colors.brown, S('Hunger') .. ': 4'),
inventory_image = 'everness_baobab_tree_fruit_roasted.png',
on_use = core.item_eat(4),
})
Everness:register_craftitem('everness:pyrite_ingot', {
description = S('Pyrite Ingot'),
inventory_image = 'everness_pyrite_ingot.png'
})
Everness:register_craftitem('everness:pyrite_lump', {
description = S('Pyrite Lump'),
inventory_image = 'everness_pyrite_lump.png'
})
Everness:register_craftitem('everness:coconut_fruit', {
description = S('Coconut') .. '\n'.. core.colorize(Everness.colors.brown, S('Hunger') .. ': 4'),
inventory_image = 'everness_coconut_item.png',
wield_scale = { x = 2, y = 2, z = 1 },
on_use = core.item_eat(4),
})
--
-- Crafting recipes
--
core.register_craft({
output = 'everness:pyrite_ingot 9',
recipe = {
{ 'everness:pyriteblock' },
}
})
--
-- Cooking recipes
--
core.register_craft({
type = 'cooking',
output = 'everness:pyrite_ingot',
recipe = 'everness:pyrite_lump',
})
+232
View File
@@ -0,0 +1,232 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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 = core.get_translator(core.get_current_modname())
doors.register('everness:door_bamboo', {
tiles = { { name = 'everness_door_bamboo.png', backface_culling = true } },
description = S('Bamboo Door'),
inventory_image = 'everness_door_bamboo_item.png',
groups = { node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1 },
sounds = Everness.node_sound_bamboo_defaults({
dug = { name = 'everness_bamboo_hit', gain = 1.25 }
}),
sound_open = 'everness_door_bamboo_open',
sound_close = 'everness_door_bamboo_open',
gain_open = 5,
gain_close = 5,
recipe = {
{ 'everness:bamboo_wood', 'everness:bamboo_wood' },
{ 'everness:bamboo_wood', 'everness:bamboo_wood' },
{ 'everness:bamboo_wood', 'everness:bamboo_wood' },
}
})
doors.register_trapdoor('everness:trapdoor_bamboo', {
description = S('Bamboo Trapdoor'),
inventory_image = 'everness_door_trapdoor_bamboo.png',
wield_image = 'everness_door_trapdoor_bamboo.png',
tile_front = 'everness_door_trapdoor_bamboo.png',
tile_side = 'everness_door_trapdoor_bamboo_side.png',
sounds = Everness.node_sound_bamboo_defaults({
dug = { name = 'everness_bamboo_hit', gain = 1.25 }
}),
sound_open = 'everness_door_bamboo_open',
sound_close = 'everness_door_bamboo_open',
gain_open = 5,
gain_close = 5,
groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1 },
})
doors.register_fencegate('everness:gate_bamboo', {
description = S('Bamboo Wood Fence Gate'),
texture = 'everness_dry_bamboo_block_side.png^[transformR90',
material = 'everness:bamboo_wood',
groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }
})
doors.register('everness:door_bone_pyrite', {
tiles = { { name = 'everness_door_bone_pyrite.png', backface_culling = true } },
description = S('Bone Pyrit Door'),
inventory_image = 'everness_door_bone_pyrite_item.png',
groups = { node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1 },
sounds = Everness.node_sound_wood_defaults(),
recipe = {
{ 'everness:pyrite_ingot', 'everness:bone' },
{ 'everness:pyrite_ingot', 'everness:bone' },
{ 'everness:pyrite_ingot', 'everness:bone' },
}
})
doors.register('everness:door_willow', {
tiles = { { name = 'everness_door_willow.png', backface_culling = true } },
description = S('Willow Door'),
inventory_image = 'everness_door_willow_item.png',
groups = { node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1 },
sounds = Everness.node_sound_wood_defaults(),
recipe = {
{ 'everness:willow_wood', 'everness:willow_wood' },
{ 'everness:willow_wood', 'everness:willow_wood' },
{ 'everness:willow_wood', 'everness:willow_wood' },
}
})
doors.register('everness:door_crystal_wood', {
description = S('Crystal Wood Door'),
tiles = { 'everness_door_crystal_wood.png' },
inventory_image = 'everness_door_crystal_wood_item.png',
use_texture_alpha = 'blend',
groups = { node = 1, choppy = 3, oddly_breakable_by_hand = 3, door = 1 },
sounds = Everness.node_sound_glass_defaults(),
sound_open = 'everness_door_glass_open',
sound_close = 'everness_door_glass_close',
gain_open = 0.2,
gain_close = 0.15,
recipe = {
{ 'everness:crystal_wood', 'everness:crystal_wood' },
{ 'everness:crystal_wood', 'everness:crystal_wood' },
{ 'everness:crystal_wood', 'everness:crystal_wood' },
}
})
doors.register_trapdoor('everness:trapdoor_crystal_wood', {
description = S('Crystal Wood Trapdoor'),
inventory_image = 'everness_door_trapdoor_crystal_wood.png',
wield_image = 'everness_door_trapdoor_crystal_wood.png',
tile_front = 'everness_door_trapdoor_crystal_wood.png',
tile_side = 'everness_door_trapdoor_crystal_wood_side.png',
use_texture_alpha = 'blend',
sounds = Everness.node_sound_glass_defaults(),
sound_open = 'everness_door_glass_open',
sound_close = 'everness_door_glass_close',
gain_open = 0.2,
gain_close = 0.15,
groups = { node = 1, choppy = 3, oddly_breakable_by_hand = 3, door = 1 },
})
doors.register_fencegate('everness:gate_crystal_wood', {
description = S('Crystal Wood Fence Gate'),
texture = 'everness_crystal_wood.png^[transformR90',
material = 'everness:crystal_wood',
groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }
})
doors.register('everness:door_cursed_wood', {
description = S('Cursed Wood Door'),
tiles = { 'everness_door_cursed_wood.png' },
inventory_image = 'everness_door_cursed_wood_item.png',
use_texture_alpha = 'blend',
groups = { node = 1, choppy = 3, oddly_breakable_by_hand = 3, door = 1 },
sounds = Everness.node_sound_wood_defaults(),
sound_open = 'everness_creaky_door_open',
sound_close = 'everness_creaky_door_close',
gain_open = 0.15,
gain_close = 0.15,
recipe = {
{ 'everness:dry_wood', 'everness:dry_wood' },
{ 'everness:dry_wood', 'everness:dry_wood' },
{ 'everness:dry_wood', 'everness:dry_wood' },
}
})
doors.register_trapdoor('everness:trapdoor_cursed_wood', {
description = S('Cursed Wood Trapdoor'),
inventory_image = 'everness_door_trapdoor_cursed_wood.png',
wield_image = 'everness_door_trapdoor_cursed_wood.png',
tile_front = 'everness_door_trapdoor_cursed_wood.png',
tile_side = 'everness_door_trapdoor_cursed_wood_side.png',
sounds = Everness.node_sound_wood_defaults(),
sound_open = 'everness_creaky_door_open',
sound_close = 'everness_creaky_door_close',
gain_open = 0.15,
gain_close = 0.15,
groups = { node = 1, choppy = 3, oddly_breakable_by_hand = 3, door = 1 },
})
-- Palm Wood
doors.register('everness:door_palm_wood', {
description = S('Palm Wood Door'),
tiles = { 'everness_door_palm_wood.png' },
inventory_image = 'everness_door_palm_wood_item.png',
use_texture_alpha = 'blend',
groups = { node = 1, choppy = 3, oddly_breakable_by_hand = 3, door = 1 },
sounds = Everness.node_sound_wood_defaults(),
recipe = {
{ 'everness:palm_tree_wood', 'everness:palm_tree_wood' },
{ 'everness:palm_tree_wood', 'everness:palm_tree_wood' },
{ 'everness:palm_tree_wood', 'everness:palm_tree_wood' },
}
})
doors.register_trapdoor('everness:trapdoor_palm_wood', {
description = S('Palm Wood Trapdoor'),
inventory_image = 'everness_door_trapdoor_palm_wood.png',
wield_image = 'everness_door_trapdoor_palm_wood.png',
tile_front = 'everness_door_trapdoor_palm_wood.png',
tile_side = 'everness_door_trapdoor_palm_wood_side.png',
sounds = Everness.node_sound_wood_defaults(),
groups = { node = 1, choppy = 3, oddly_breakable_by_hand = 3, door = 1 },
})
doors.register_fencegate('everness:gate_palm_wood', {
description = S('Palm Wood Fence Gate'),
texture = 'everness_palm_tree_wood.png^[sheet:2x2:1,1',
material = 'everness:palm_tree_wood',
groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }
})
-- Coral Wood
doors.register_fencegate('everness:gate_coral_wood', {
description = S('Coral Wood Fence Gate'),
texture = 'everness_coral_wood.png',
material = 'everness:coral_wood',
groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }
})
-- Lava Tree Wood
doors.register('everness:door_lava_tree', {
description = S('Lava Tree Wood Door'),
tiles = { 'everness_door_lava_tree_wood.png' },
inventory_image = 'everness_door_lava_tree_wood_item.png',
use_texture_alpha = 'blend',
groups = { node = 1, choppy = 3, oddly_breakable_by_hand = 3, door = 1 },
sounds = Everness.node_sound_wood_defaults(),
recipe = {
{ 'everness:lava_tree_wood', 'everness:lava_tree_wood' },
{ 'everness:lava_tree_wood', 'everness:lava_tree_wood' },
{ 'everness:lava_tree_wood', 'everness:lava_tree_wood' },
}
})
doors.register_trapdoor('everness:trapdoor_lava_tree', {
description = S('Lava Tree Wood Trapdoor'),
inventory_image = 'everness_door_trapdoor_lava_tree_wood.png',
wield_image = 'everness_door_trapdoor_lava_tree_wood.png',
tile_front = 'everness_door_trapdoor_lava_tree_wood.png',
tile_side = 'everness_door_trapdoor_lava_tree_wood_side.png',
sounds = Everness.node_sound_wood_defaults(),
groups = { node = 1, choppy = 3, oddly_breakable_by_hand = 3, door = 1 },
})
doors.register_fencegate('everness:gate_lava_tree_wood', {
description = S('Lava Tree Wood Fence Gate'),
texture = 'everness_lava_tree.png^[sheet:2x2:1,1',
material = 'everness:lava_tree',
groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }
})
File diff suppressed because it is too large. Load diff
+209
View File
@@ -0,0 +1,209 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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 = core.get_translator(core.get_current_modname())
-- Dry Wood
default.register_fence('everness:fence_dry_wood', {
description = S('Dry Wood Fence'),
texture = 'everness_fence_dry_wood.png',
inventory_image = 'default_fence_overlay.png^everness_dry_wood.png^' ..
'default_fence_overlay.png^[makealpha:255,126,126',
wield_image = 'default_fence_overlay.png^everness_dry_wood.png^' ..
'default_fence_overlay.png^[makealpha:255,126,126',
material = 'everness:dry_wood',
groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 },
sounds = Everness.node_sound_wood_defaults()
})
default.register_fence_rail('everness:fence_rail_dry_wood', {
description = S('Dry Wood Fence Rail'),
texture = 'everness_fence_rail_dry_wood.png',
inventory_image = 'default_fence_rail_overlay.png^everness_dry_wood.png^' ..
'default_fence_rail_overlay.png^[makealpha:255,126,126',
wield_image = 'default_fence_rail_overlay.png^everness_dry_wood.png^' ..
'default_fence_rail_overlay.png^[makealpha:255,126,126',
material = 'everness:dry_wood',
groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 },
sounds = Everness.node_sound_wood_defaults()
})
default.register_mesepost('everness:mese_post_light_dry_wood', {
description = S('Dry Wood Mese Post Light'),
texture = 'everness_fence_dry_wood.png',
material = 'everness:dry_wood',
})
-- Bamboo Wood
default.register_fence('everness:fence_bamboo_wood', {
description = S('Bamboo Wood Fence'),
texture = 'everness_fence_bamboo_wood.png',
inventory_image = 'default_fence_overlay.png^everness_dry_bamboo_block_side.png^' ..
'default_fence_overlay.png^[makealpha:255,126,126',
wield_image = 'default_fence_overlay.png^everness_dry_bamboo_block_side.png^' ..
'default_fence_overlay.png^[makealpha:255,126,126',
material = 'everness:bamboo_wood',
groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 },
sounds = Everness.node_sound_wood_defaults()
})
default.register_fence_rail('everness:fence_rail_bamboo_wood', {
description = S('Bamboo Wood Fence Rail'),
texture = 'everness_fence_rail_bamboo_wood.png^[transformR90',
inventory_image = 'default_fence_rail_overlay.png^everness_dry_bamboo_block_side.png^' ..
'default_fence_rail_overlay.png^[makealpha:255,126,126',
wield_image = 'default_fence_rail_overlay.png^everness_dry_bamboo_block_side.png^' ..
'default_fence_rail_overlay.png^[makealpha:255,126,126',
material = 'everness:bamboo_wood',
groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 },
sounds = Everness.node_sound_wood_defaults()
})
default.register_mesepost('everness:mese_post_light_bamboo_wood', {
description = S('Bamboo Wood Mese Post Light'),
texture = 'everness_fence_bamboo_wood.png^[transformFY',
material = 'everness:bamboo_wood',
})
-- Crystal Wood
default.register_fence('everness:fence_crystal_wood', {
description = S('Crystal Wood Fence'),
texture = 'everness_fence_crystal_wood.png',
inventory_image = 'default_fence_overlay.png^everness_crystal_wood.png^' ..
'default_fence_overlay.png^[makealpha:255,126,126',
wield_image = 'default_fence_overlay.png^everness_crystal_wood.png^' ..
'default_fence_overlay.png^[makealpha:255,126,126',
material = 'everness:crystal_wood',
groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 },
sounds = Everness.node_sound_wood_defaults()
})
default.register_fence_rail('everness:fence_rail_crystal_wood', {
description = S('Crystal Wood Fence Rail'),
texture = 'everness_fence_rail_crystal_wood.png^[transformR90',
inventory_image = 'default_fence_rail_overlay.png^everness_crystal_wood.png^' ..
'default_fence_rail_overlay.png^[makealpha:255,126,126',
wield_image = 'default_fence_rail_overlay.png^everness_crystal_wood.png^' ..
'default_fence_rail_overlay.png^[makealpha:255,126,126',
material = 'everness:crystal_wood',
groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 },
sounds = Everness.node_sound_wood_defaults()
})
default.register_mesepost('everness:mese_post_light_crystal_wood', {
description = S('Crystal Wood Mese Post Light'),
texture = 'everness_fence_crystal_wood.png^[transformFY',
material = 'everness:crystal_wood',
})
-- Palm Wood
default.register_fence('everness:fence_palm_wood', {
description = S('Palm Wood Fence'),
texture = 'everness_fence_palm_wood.png',
inventory_image = 'default_fence_overlay.png^everness_palm_tree_wood.png^' ..
'default_fence_overlay.png^[makealpha:255,126,126',
wield_image = 'default_fence_overlay.png^everness_palm_tree_wood.png^' ..
'default_fence_overlay.png^[makealpha:255,126,126',
material = 'everness:palm_tree_wood',
groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 },
sounds = Everness.node_sound_wood_defaults()
})
default.register_fence_rail('everness:fence_rail_palm_wood', {
description = S('Palm Wood Fence Rail'),
texture = 'everness_fence_rail_palm_wood.png^[transformR90',
inventory_image = 'default_fence_rail_overlay.png^everness_palm_tree_wood.png^' ..
'default_fence_rail_overlay.png^[makealpha:255,126,126',
wield_image = 'default_fence_rail_overlay.png^everness_palm_tree_wood.png^' ..
'default_fence_rail_overlay.png^[makealpha:255,126,126',
material = 'everness:palm_tree_wood',
groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 },
sounds = Everness.node_sound_wood_defaults()
})
default.register_mesepost('everness:mese_post_light_palm_wood', {
description = S('Palm Wood Mese Post Light'),
texture = 'everness_fence_palm_wood.png^[transformFY',
material = 'everness:palm_tree_wood',
})
-- Coral Wood
default.register_fence('everness:fence_coral_wood', {
description = S('Coral Wood Fence'),
texture = 'everness_fence_coral_wood.png',
inventory_image = 'default_fence_overlay.png^everness_fence_coral_wood.png^' ..
'default_fence_overlay.png^[makealpha:255,126,126',
wield_image = 'default_fence_overlay.png^everness_fence_coral_wood.png^' ..
'default_fence_overlay.png^[makealpha:255,126,126',
material = 'everness:coral_wood',
groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 },
sounds = Everness.node_sound_wood_defaults()
})
default.register_fence_rail('everness:fence_rail_coral_wood', {
description = S('Coral Wood Fence Rail'),
texture = 'everness_fence_rail_coral_wood.png^[transformR90',
inventory_image = 'default_fence_rail_overlay.png^everness_fence_coral_wood.png^' ..
'default_fence_rail_overlay.png^[makealpha:255,126,126',
wield_image = 'default_fence_rail_overlay.png^everness_fence_coral_wood.png^' ..
'default_fence_rail_overlay.png^[makealpha:255,126,126',
material = 'everness:coral_wood',
groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 },
sounds = Everness.node_sound_wood_defaults()
})
default.register_mesepost('everness:mese_post_light_coral_wood', {
description = S('Coral Wood Mese Post Light'),
texture = 'everness_fence_coral_wood.png^[transformFY',
material = 'everness:coral_wood',
})
-- Lava Tree Wood
default.register_fence('everness:fence_lava_tree_wood', {
description = S('Lava Tree Wood Fence'),
texture = 'everness_fence_lava_tree_wood.png',
inventory_image = 'default_fence_overlay.png^everness_lava_tree_wood.png^' ..
'default_fence_overlay.png^[makealpha:255,126,126',
wield_image = 'default_fence_overlay.png^everness_lava_tree_wood.png^' ..
'default_fence_overlay.png^[makealpha:255,126,126',
material = 'everness:lava_tree_wood',
groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 },
sounds = Everness.node_sound_wood_defaults()
})
default.register_fence_rail('everness:fence_rail_lava_tree_wood', {
description = S('Lava Tree Wood Fence Rail'),
texture = 'everness_fence_rail_lava_tree_wood.png^[transformR90',
inventory_image = 'default_fence_rail_overlay.png^everness_lava_tree_wood.png^' ..
'default_fence_rail_overlay.png^[makealpha:255,126,126',
wield_image = 'default_fence_rail_overlay.png^everness_lava_tree_wood.png^' ..
'default_fence_rail_overlay.png^[makealpha:255,126,126',
material = 'everness:lava_tree_wood',
groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 },
sounds = Everness.node_sound_wood_defaults()
})
default.register_mesepost('everness:mese_post_light_lava_tree_wood', {
description = S('Lava Tree Wood Mese Post Light'),
texture = 'everness_fence_lava_tree_wood.png^[transformFY',
material = 'everness:lava_tree_wood',
})
File diff suppressed because it is too large. Load diff
+271
View File
@@ -0,0 +1,271 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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 path = core.get_modpath('everness')
local mod_start_time = core.get_us_time()
dofile(path .. '/api.lua')
-- Legacy backwards compatibility
core.register_alias('everness:dirt_with_grass_2', 'everness:dirt_with_grass_1')
core.register_alias('everness:path_dirt_with_grass_2', 'everness:path_dirt_with_grass_1')
-- MineClonia / VoxeLibre support
local is_mcl = core.get_modpath('mcl_core') and core.global_exists('mcl_core')
if is_mcl then
dofile(path .. '/mod_support_mcl_aliases.lua')
end
dofile(path .. '/nodes.lua')
dofile(path .. '/nodes_farming.lua')
if Everness.settings.biomes.everness_mineral_waters_under.enabled then
dofile(path .. '/nodes_mineral_waters_under.lua')
end
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')
dofile(path .. '/mapgen.lua')
if Everness.settings.biomes.everness_bamboo_forest_under.enabled then
dofile(path .. '/mapgen_bamboo_forest_under.lua')
end
if Everness.settings.biomes.everness_bamboo_forest.enabled then
dofile(path .. '/mapgen_bamboo_forest.lua')
end
if Everness.settings.biomes.everness_baobab_savanna.enabled then
dofile(path .. '/mapgen_baobab_savanna.lua')
end
if Everness.settings.biomes.everness_coral_forest_dunes.enabled then
dofile(path .. '/mapgen_coral_forest_dunes.lua')
end
if Everness.settings.biomes.everness_coral_forest_ocean.enabled then
dofile(path .. '/mapgen_coral_forest_ocean.lua')
end
if Everness.settings.biomes.everness_coral_forest_deep_ocean.enabled then
dofile(path .. '/mapgen_coral_forest_deep_ocean.lua')
end
if Everness.settings.biomes.everness_coral_forest_under.enabled then
dofile(path .. '/mapgen_coral_forest_under.lua')
end
if Everness.settings.biomes.everness_coral_forest.enabled then
dofile(path .. '/mapgen_coral_forest.lua')
end
if Everness.settings.biomes.everness_crystal_forest_dunes.enabled then
dofile(path .. '/mapgen_crystal_forest_dunes.lua')
end
if Everness.settings.biomes.everness_crystal_forest_ocean.enabled then
dofile(path .. '/mapgen_crystal_forest_ocean.lua')
end
if Everness.settings.biomes.everness_crystal_forest_deep_ocean.enabled then
dofile(path .. '/mapgen_crystal_forest_deep_ocean.lua')
end
if Everness.settings.biomes.everness_crystal_forest_shore.enabled then
dofile(path .. '/mapgen_crystal_forest_shore.lua')
end
if Everness.settings.biomes.everness_crystal_forest_under.enabled then
dofile(path .. '/mapgen_crystal_forest_under.lua')
end
if Everness.settings.biomes.everness_crystal_forest.enabled then
dofile(path .. '/mapgen_crystal_forest.lua')
end
if Everness.settings.biomes.everness_cursed_lands_dunes.enabled then
dofile(path .. '/mapgen_cursed_lands_dunes.lua')
end
if Everness.settings.biomes.everness_cursed_lands_ocean.enabled then
dofile(path .. '/mapgen_cursed_lands_ocean.lua')
end
if Everness.settings.biomes.everness_cursed_lands_deep_ocean.enabled then
dofile(path .. '/mapgen_cursed_lands_deep_ocean.lua')
end
if Everness.settings.biomes.everness_cursed_lands_swamp.enabled then
dofile(path .. '/mapgen_cursed_lands_swamp.lua')
end
if Everness.settings.biomes.everness_cursed_lands_under.enabled then
dofile(path .. '/mapgen_cursed_lands_under.lua')
end
if Everness.settings.biomes.everness_cursed_lands.enabled then
dofile(path .. '/mapgen_cursed_lands.lua')
end
if Everness.settings.biomes.everness_forsaken_desert_ocean.enabled then
dofile(path .. '/mapgen_forsaken_desert_ocean.lua')
end
if Everness.settings.biomes.everness_forsaken_desert_under.enabled then
dofile(path .. '/mapgen_forsaken_desert_under.lua')
end
if Everness.settings.biomes.everness_forsaken_desert.enabled then
dofile(path .. '/mapgen_forsaken_desert.lua')
end
if Everness.settings.biomes.everness_forsaken_tundra_beach.enabled then
dofile(path .. '/mapgen_forsaken_tundra_beach.lua')
end
if Everness.settings.biomes.everness_forsaken_tundra_ocean.enabled then
dofile(path .. '/mapgen_forsaken_tundra_ocean.lua')
end
if Everness.settings.biomes.everness_forsaken_tundra_under.enabled then
dofile(path .. '/mapgen_forsaken_tundra_under.lua')
end
if Everness.settings.biomes.everness_forsaken_tundra.enabled then
dofile(path .. '/mapgen_forsaken_tundra.lua')
end
if Everness.settings.biomes.everness_frosted_icesheet_ocean.enabled then
dofile(path .. '/mapgen_frosted_icesheet_ocean.lua')
end
if Everness.settings.biomes.everness_frosted_icesheet_under.enabled then
dofile(path .. '/mapgen_frosted_icesheet_under.lua')
end
if Everness.settings.biomes.everness_frosted_icesheet.enabled then
dofile(path .. '/mapgen_frosted_icesheet.lua')
end
if Everness.settings.biomes.everness_mineral_waters.enabled then
dofile(path .. '/mapgen_mineral_waters.lua')
end
if Everness.settings.biomes.everness_mineral_waters_under.enabled then
dofile(path .. '/mapgen_mineral_waters_under.lua')
end
if core.register_mapgen_script then
Everness.async_mapgen_active = true
core.register_mapgen_script(path .. '/mapgen_async.lua')
else
Everness.async_mapgen_active = false
end
dofile(path .. '/mapgen_after.lua')
if is_mcl then
dofile(path .. '/mod_support_mcl.lua')
else
if core.get_modpath('xpanes') and core.global_exists('xpanes') then
dofile(path .. '/panes.lua')
end
local enable_moreblocks = Everness.settings.features.everness_enable_moreblocks
and (core.get_modpath('moreblocks') or core.get_modpath('stairsplus'))
and core.global_exists('stairsplus')
if enable_moreblocks then
dofile(path .. '/mod_support_moreblocks.lua')
elseif core.get_modpath('stairs') and core.global_exists('stairs') then
dofile(path .. '/stairs.lua')
end
if core.get_modpath('walls') and core.global_exists('walls') then
dofile(path .. '/walls.lua')
end
if core.get_modpath('default') or core.global_exists('default') then
if default.register_fence
and default.register_fence_rail
and default.register_mesepost
then
dofile(path .. '/fences.lua')
end
end
if core.get_modpath('doors') and core.global_exists('doors') then
dofile(path .. '/doors.lua')
end
end
if not core.get_modpath('bucket') and not core.get_modpath('mcl_buckets') then
dofile(path .. '/buckets.lua')
end
dofile(path .. '/tools.lua')
dofile(path .. '/craftitems.lua')
dofile(path .. '/crafting.lua')
if Everness.settings.features.everness_feature_skybox then
dofile(path .. '/skybox.lua')
end
dofile(path .. '/env_sounds.lua')
if Everness.settings.features.everness_feature_sneak_pickup and not core.get_modpath('mcl_core') then
dofile(path .. '/sneak_pickup.lua')
end
dofile(path .. '/privileges.lua')
dofile(path .. '/chat_commands.lua')
Everness:encyclopedia_init()
core.register_on_mods_loaded(function()
Everness.set_loot_chest_items()
end)
--
-- Mod Support
--
if core.get_modpath('x_farming') and core.global_exists('x_farming') then
dofile(path .. '/mod_support_x_farming.lua')
end
if core.get_modpath('x_tumbleweed') and core.global_exists('XTumbleweed') then
dofile(path .. '/mod_support_x_tumbleweed.lua')
end
if core.get_modpath('x_obsidianmese')
and core.global_exists('x_obsidianmese')
-- backwards compatibility check
and x_obsidianmese.register_path_node
then
dofile(path .. '/mod_support_x_obsidianmese.lua')
end
-- Minetest Game
dofile(path .. '/mod_support_mtg.lua')
local mod_end_time = (core.get_us_time() - mod_start_time) / 1000000
print('[Mod] everness loaded.. [' .. mod_end_time .. 's]')
+621
View File
@@ -0,0 +1,621 @@
# textdomain: everness
@1 will intersect protection on growth.=
Compost chance=
Everness Encyclopedia=
You need "everness_encyclopedia" privilige to access this button.=
Empty Bucket=
Get biome name where you are standing.=
This command can only be executed in-game!=
Locked Chest=
Locked Chest (owned by @1)=
You do not own this chest.=
a locked chest=
Chest=
Quartz Crystal=Cristal de Quartz
Baobab Roasted Fruit=Fruit de Baobab Rôti
Pyrite Ingot=Lingot de Pyrite
Pyrite Lump=Morceau de Pyrite
Bamboo=Bambou
Hunger=
Coconut=
Coral Wood Fence Gate=
Lava Tree Wood Door=
Lava Tree Wood Trapdoor=
Lava Tree Wood Fence Gate=
Bamboo Wood Fence Gate=Portillon en bois de bambou
Crystal Wood Fence Gate=
Palm Wood Fence Gate=
Bamboo Door=Porte en Bambou
Bamboo Trapdoor=Trappe en Bambou
Bone Pyrit Door=Porte en os de pyrite
Willow Door=Porte en Saule
Crystal Wood Door=
Crystal Wood Trapdoor=
Cursed Wood Door=
Cursed Wood Trapdoor=
Palm Wood Door=
Palm Wood Trapdoor=
Dry Wood Fence Rail=Rail de clôture en bois sec
Dry Wood Mese Post Light=Lampadaire de Mese en bois sec
Bamboo Wood Fence Rail=Rail de clôture en bois de bambou
Bamboo Wood Mese Post Light=Lampadaire de Mese en bois de bambou
Crystal Wood Fence Rail=
Crystal Wood Mese Post Light=
Palm Wood Fence Rail=
Palm Wood Mese Post Light=
Coral Wood Fence=
Coral Wood Fence Rail=
Coral Wood Mese Post Light=
Lava Tree Wood Fence=
Lava Tree Wood Fence Rail=
Lava Tree Wood Mese Post Light=
Dry Wood Fence=Clôture en bois sec
Bamboo Wood Fence=Clôture en bois de bambou
Crystal Wood Fence=
Palm Wood Fence=
Dry Wood Fence Gate=
Coral Desert Stone Stair=
Coral Desert Stone Slab=
Double Coral Desert Stone Slab=
Coral Desert Cobblestone Stair=
Coral Desert Cobblestone Slab=
Double Coral Desert Cobblestone Slab=
Coral Mossy Cobblestone Stair=
Coral Mossy Cobblestone Slab=
Double Coral Mossy Cobblestone Slab=
Cursed Brick Stair=
Cursed Brick Slab=
Double Cursed Brick Slab=
Cursed Brick with Growth Stair=
Cursed Brick with Growth Slab=
Double Cursed Brick with Growth Slab=
Double Coral Bones Block Slab=
Double Coral Bones Brick Slab=
Double Quartz Block Slab=
Double Quartz Chiseled Slab=
Double Quartz Pillar Slab=
Double Dry Wood Slab=
Double Coral Wood Slab=
Double Bamboo Wood Slab=
Double Bamboo Mosaic Wood Slab=
Double Forsaken Desert Brick Slab=
Double Forsaken Desert Brick Red Slab=
Double Forsaken Desert Chiseled Stone Slab=
Double Baobab Wood Slab=
Double Sequoia Wood Slab=
Double Forsaken Tundra Cobblestone Slab=
Double Forsaken Tundra Stone Slab=
Double Forsaken Tundra Brick Slab=
Double Willow Wood Slab=
Double Magma Cobblestone Slab=
Double Volcanic Rock Slab=
Double Volcanic Rock with Magma Slab=
Double Coral Depp Ocean Sandstone Block Slab=
Double Coral Depp Ocean Sandstone Brick Slab=
Double Coral White Sandstone Slab=
Double Coral White Sandstone Pillar Slab=
Double Coral White Sandstone Brick Slab=
Double Coral Desert Stone Block Slab=
Double Coral Desert Stone Brick Slab=
Double Coral Sandstone Slab=
Double Coral Sandstone Brick Slab=
Double Coral Sandstone Chiseled Slab=
Double Coral Sandstone Carved Slab=
Double Cursed Lands Deep Ocean Sandstone Block Slab=
Double Cursed Lands Deep Ocean Sandstone Brick Slab=
Double Crystal Forest Deep Ocean Sandstone Block Slab=
Double Crystal Forest Deep Ocean Sandstone Brick Slab=
Double Crystal Cobblestone Slab=
Double Crystal Mossy Cobblestone Slab=
Double Crystal Stone Brick Slab=
Double Crystal Wood Slab=
Double Mese Wood Slab=
Double=
A bucket can be used to collect and release liquids. This one is filled with mineral water.=
Place it to empty the bucket and create a mineral water source.=
Places a mineral water source=
Bucket=
Water=
Coral Cobblestone Wall=Mur de pavés coraliens
Coral Mossy Cobblestone Wall=Mur de pavés coraliens moussus
Cursed Brick Wall=Mur de briques maudites
Cursed Brick with Growth Wall=
Forsaken Tundra Cobblestone Wall=Mur de pavés de toundra abandonnée
Forsaken Tundra Stone Wall=Mur de pierre de toundra abandonnée
Forsaken Tundra Brick Wall=Mur de briques de toundra abandonnée
Magma Cobblestone Wall=Mur de pavé magmatique
Volcanic Rock Wall=Mur de roches volcaniques
Volcanic Rock with Magma Wall=Mur de roches volcaniques avec du magma
Lava Bucket=
Mineral=
Coal Ore=
Pyrite Ore=Minerai de pyrite
Ceramic Sherds. Use archeological pickaxe to have a chance of getting various different sherds.=
Ceramic Sherds=
Pyrite Block=Bloc de pyrite
Forged Pyrite Block=Bloc de pyrite forgé
Pyrite Brick=Brique de pyrite
Pyrite Slab Brick=Dalle de brique de pyrite
Pyrite Spiral=Spirale de pyrite
Pyrite Pillar Bottom=Pied de pilier en pyrite
Pyrite Pillar Middle=Colonne de pilier en pyrite
Pyrite Pillar Top=Tête de pilier en pyrite
Pyrite Pillar Small=Petit pilier en pyrite
Polished Pyrite Block=Bloc de pyrite poli
Quartz Ore=Minerai de quartz
Coral Desert Stone=Pierre de désert coralien
Crystal Stone=
Coral Sandstone=
Coral Sandstone Brick=
Coral Sandstone Chiseled Block=
Coral Sandstone Carved Block=
Coral White Sandstone=
Coral White Sandstone Brick=
Coral White Sandstone Pillar=
Coral Desert Stone Block=
Coral Desert Stone Brick=
Coral Bones=Os coraliens
Coral Bones Block=
Coral Bones Brick=
Crystal Cobblestone=
Crystal Mossy Cobblestone=
Crystal Stone Brick=
Coral Desert Cobblestone=Pavé de désert coralien
Coral Mossy Cobblestone=Pavé de mousse coralienne
Coral Desert Stone with Moss=Pierre de désert coralien avec de la mousse
Coral Deep Ocean Sandstone Block=
Coral Deep Ocean Sandstone Brick=
Cursed Lands Deep Ocean Sandstone Block=
Cursed Lands Deep Ocean Sandstone Brick=
Crystal Forest Deep Ocean Sandstone Block=
Crystal Forest Deep Ocean Sandstone Brick=
Forsaken Desert Stone=Pierre de désert abandonné
Forsaken Desert Cobblestone Red=Pavé rouge de désert abandonné
Forsaken Desert Cobblestone=Pavé de désert abandonné
Volcanic Rock=Roche volcanique
Volcanic Rock with Magma=Roche volcanique avec du magma
Cursed Stone=Pierre maudite
Cursed Stone Carved=
Cursed Brick=Brique maudite
Cursed Brick with Growth=
Cursed Brick Mixed=
Cursed Brick Carved=
Volcanic Sulfur Stone=Pierre volcanique sulfurée
Sulfur Stone=Pierre de soufre
Forsaken Tundra Cobblestone=Pavé de toundra abandonnée
Forsaken Tundra Stone=Pierre de toundra abandonnée
Mold Cobble=Galet de moule
Forsaken Tundra Brick=Brique de toundra abandonnée
Forsaken Tundra Rocks=Roche de toundra abandonnée
Blue Crying Obsidian=Obsidienne pleureuse bleue
Blue Weeping Obsidian=Obsidienne larmoyante bleue
Weeping Obsidian=Obsidienne larmoyante
Mold Stone=Pierre de moule
Soul Sandstone=Grès des âmes
Soul Sandstone Veined=Grès des âmes veiné
Purple Crystal Block=Bloc de cristal pourpre
Orange Crystal Block=Bloc de cristal orange
Cyan Crystal Block=
Quartz Block=Bloc de quartz
Chiseled Quartz=Quartz ciselé
Quartz Pillar=Pilier de quartz
Forsaken Desert Brick=Brique de désert abandonné
Forsaken Desert Brick Red=Brique rouge de désert abandonné
Forsaken Desert Engraved Stone=Pierre gravée de désert abandonné
Crystal Sandstone=
Crystal Sandstone Brick=
Crystal Sandstone Chiseled=
Cursed Sandstone Block=
Cursed Sandstone Brick=
Coral Dirt=Terre coralienne
Coral Deep Ocean Mud=
Cursed Dirt=Terre maudite
Crystal Dirt=Terre de cristal
Forsaken Tundra Dirt=Terre de toundra abandonnée
Forsaken Tundra Dirt with Grass=Terre de toundra abandonnée avec de l'herbe
Dirt with Coral Grass=Terre avec de l'herbe coralienne
Dirt with Cursed Grass=Terre avec de l'herbe maudite
Dirt with Crystal Grass=Terre avec de l'herbe de cristal
Dry Ocean Dirt=Terre de l'océan sec
Gravel=
Permanent Fire=
Dirt=Terre
Dry Dirt=
Dirt with Dry Grass=
Dirt with Grass=Terre avec de l'herbe
Crystal Cave Dirt=Terre de caverne de cristal
Crystal Cave Dirt with Moss=Terre de caverne de cristal avec de l'herbe
Moss Block=Bloc de mousse
Crystal Moss Block=Bloc de mousse de cristal
Coral Sand=Sable coralien
Coral White Sand=Sable coralien blanc
Cursed Sand=Sable maudit
Crystal Sand=Sable de cristal
Crystal Forest Deep Ocean Sand with Crack=
Forsaken Tundra Beach Sand=Sable de plage de toundra abandonnée
Forsaken Tundra Beach Sand with Shells=Sable de plage de toundra abandonnée avec des coquillages
Forsaken Desert Sand=Sable de désert abandonné
Coral Forest Deep Ocean Sand=
Cursed Lands Deep Ocean Sand=
Cursed Lands Deep Ocean Sand with Crack=
Crystal Forest Deep Ocean Sand=
Mineral Sand=
Frosted Snow Block=Bloc de neige givré
Frosted Ice=Glace givrée
Frosted Ice Translucent=Glace givrée transparente
Frosted Cave Ice=Glace de caverne givrée
Bone=Os
Ancient Emerald Ice=Glace d'émeraude ancienne
Dense Emerald Ice=Glace d'émeraude dense
Emerald Ice=Glace d'émeraude
Cursed Mud=Boue maudite
Cobweb=Toile d'araignée
Cave Flower=Fleur des cavernes
Cave Flower with Particles=Fleur des cavernes avec particules
Lotus=
Flower=
Animated=
Leaf=
Dry=
Forsaken Fire=Feu abandonné
Coral Tree Trunk=Tronc d'arbre coralien
Coral Wood Planks=
Coral Tree Bioluminescent=Arbre coralien luminescent
Cursed Dream Stone=Pierre de rêve maudite
Dry Tree Trunk=Tronc d'arbre sec
Baobab Tree Trunk=Tronc de Baobab
Sequoia Tree Trunk=Tronc de Séquoia
Willow Tree Trunk=Tronc de Saule
Willow Wood Planks=Planches en bois de saule
Dry Wood Planks=Planches en bois sec
Hollow Tree Trunk=Tronc d'arbre creux
Crystal Tree Trunk=Tronc d'arbre de cristal
Crystal Wood Planks=
Mese Tree Trunk=Tronc d'arbre à Mese
Trunk=
Mese Tree Leaves=
Baobab Tree Leaves=Feuilles de Baobab
Sequoia Tree Leaves=Feuilles de Séquoia
Baobab Fruit=Fruit du Baobab
Baobab Fruit Marker=Marqueur du fruit du Baobab
Baobab Sapling=Plant de Baobab
Willow Tree Leaves=Feuilles de saule
Coral Tree Leaves=Feuille d'arbre coralien
Dry Tree Branches=Branches d'arbre sec
Crystal Tree Leaves=Feuille d'arbre de cristal
Coral Tree Sapling=Plant d'arbre coralien
Coral Tree Bioluminescent Sapling=Plant d'arbre coralien luminescent
Dry Tree Sapling=Plant d'arbre sec
Cursed Dream Tree Sapling=Plant d'arbre des rêves maudit
Willow Tree Sapling=
Sequoia Tree Sapling=Plant de Séquoia
Crystal Tree Sapling=Plant d'arbre de cristal
Crystal Tree Large Sapling=Grand plant d'arbre de cristal
Crystal Bush Stem=Tige de buisson de cristal
Crystal Bush Leaves=Feuilles de buisson de cristal
Crystal Bush Sapling=Plant de buisson de cristal
Cursed Bush Stem=Tige de buisson maudit
Cursed Bush Leaves=Feuilles de buisson maudit
Cursed Bush Sapling=Plant de buisson maudit
Flowers=
Magenta Flowers=
Clover=
Luminous Mushroom=
Glossy Mushroom=
Staghorn Coral (Stage 1)=
Staghorn Coral (Stage 2)=
Staghorn Coral (Stage 3)=
Clover with flowers=
Aurora Violet=
Aurora Sky Blue=
Aurora Cyan=
Aurora Mint=
Aurora Lavender=
Aurora Lime=
Aurora Coral=
Aurora Magenta=
Glass Crystal Cluster=
Glass Megalith Foundation=
Glass Megalith Lower Shaft=
Glass Megalith Mid Nexus=
Glass Megalith Upper Spire=
Glass Megalith Summit Needle=
Coral Burdock=Bardane coralienne
Coral Bush=Buisson coralien
Coral Shrub=Arbuste coralien
Orange Coral Grass=Herbe coralienne orange
Globulagus=Eucalyptus Globulus
Tall Coral Grass=Grande Herbe coralienne
Purple Crystal=Cristal pourpre
Orange Crystal=Cristal orange
Cyan Crystal=Cristal cyan
Coral Plant Bioluminescent=Plante coralienne bioluminescente
Blooming Cooksonia=Cooksonia en fleur
Creeping Moss Spores=Spores de mousse grimpante
Frosted Icicle=Glaçon givré
Frosted Icicle Floor=Sol de glaçon givré
Coral Grass=Herbe coralienne
Baobab Savanna Grass=
Red Castor=Ricin rouge
Crystal Mushrooms=Champigons de cristal
Twisted Crystal Grass=Herbe de cristal tordue
Twisted Crystal Spire=
Crystal Grass=Herbe de cristal
Marsh Grass=Herbe des marais
Forsaken Plant=Plante abandonnée
Blue Cactus=Cactus bleu
Cave Barrel Cactus=Cactus baril des cavernes
Venus Trap Plant=Dionée attrape-mouche
Illumi Root=Illumi Racine
Crystal Waterlily=Nénuphar de cristal
Orange Cactus=Cactus orange
Agave Leaf=Feuille d'agave
Mese Fruit=
Mese Tree Sapling=
Egg plant=Aubergine
Ivis Moss=Mousse d'Ivis
Ngrass=N-Herbe
Bamboo Sprout=Pousse de bambou
Blood Spoore Plant=Plante spore sanglante
Blood Spoore Plant Small=Petite plante spore sanglante
Termite Block=Bloc de termitière
Bamboo Block=Bloc de bambou
Bamboo Planks=Planches de bambou
Bamboo Mosaic=Mosaïque de bambou
Baobab Wood Planks=Planches en bois de Baobab
Sequoia Wood Planks=Planches en bois de Séquoia
Mese Wood Planks=
Coral Corals=Coraux coraliens
Coral Frosted=Givré coralien
Coral Starfish=Étoile de mer coralienne
Spine Kelp=Varch épineux
Coral Bulbs=
Coral Tree=
Coral Palm=
Coral Anemone=
Coral Darkilluma=
Coral Demon=
Crystal Forest Deep Ocean Coral Plant Cyan=
Crystal Forest Deep Ocean Coral Plant Orange=
Crystal Forest Deep Ocean Coral Plant Pink=
Crystal Coral Dark=Cristal coralien sombre
Crystal Coral Light=Cristal coralien clair
Coral Forest Deep Ocean Coral Pink=
Coral Forest Deep Ocean Coral Cyan=
Coral Forest Deep Ocean Coral Green=
Coral Forest Deep Ocean Coral Red=
Coral Alcyonacea=
Coral Ostracod=
Coral Octocurse=
Crystal Forest Deep Ocean Coral Green=
Crystal Forest Deep Ocean Coral Orange=
Crystal Forest Deep Ocean Coral Cyan=
Coral Skeleton=
Mineral Water Weed=
Skull with Candle=Squelette avec bougie
Forsythia Bush=Buisson de Forsythia
Rose Bush=
Glowing Pillar=Pilier rayonnant
Blue Vine Lantern=Lanterne de vigne bleue
Amaranita Lantern=Lanterne Amarante
Lumecorn=Blé luminescent
Everness Glass=
Tinted Glass Red=Verre teinté rouge
Pyrite Lantern=Lanterne en pyrite
Pyrite Glass=Verre de pyrite
Lumabus Vine Lantern=Lanterne de vigne luminescente
Eye Vine Lantern=Lanterne de vigne oculaire
Cursed Pumpkin Lantern=Lanterne citrouille maudite
Floating Crystal=Cristal flottant
Coral Forest Deep Ocean Lantern=
Mineral Water Source=
Flowing Mineral Water=
Lava Source=
Flowing Lava=
Geyser=
Active=
Ceramic=
Pot=
If destroyed by archelogical pick axe, it will drop ceramic sherds instead of ceramic pot item.=
owned by=
Sherd=
Sand=
Castle=
Wall=
Purple=
Green=
Red=
Blue=
Yellow=
Magenta=
Cyan=
White=
Cursed Skeleton Hands=
Cursed Rib Cage=
Cursed Skull on Stick=
Coral Dirt Soil=
Dirt Soil=
Crystal Dirt Soil=
Crystal Cave Dirt Soil=
Cursed Dirt Soil=
Dry Dirt Soil=
Coral Dirt Wet Soil=
Crystal Dirt Wet Soil=
Crystal Cave Dirt Wet Soil=
Cursed Dirt Wet Soil=
Mineral Cave Stone=
Mineral Cave Cobblestone=
Mineral Lava Stone with lava=
Mineral Lava Stone without lava=
Mineral Lava Stone with moss=
Volcanic Spike=
Mineral Lava Stone Spike=
Lava Tree Trunk=
Lava Tree Trunk with Lava Veins=
Lava Tree Wood Planks=
Lava=
Mineral Cave Moss Grass=
Sapling=
Leaves=
Pyrite Glass Pane=Panneau de verre de pyrite
Cursed Steel Bars=
Cursed Steel Bar Door=
Steel Bar Trapdoor=
Dry Tree Trunk Stair=
Dry Tree Trunk Slab=
Forsaken Desert Engraved Stone Stair=
Forsaken Desert Engraved Stone Slab=
Forsaken Desert Cobblestone Stair=
Forsaken Desert Cobblestone Slab=
Forsaken Desert Cobblestone Red Stair=
Forsaken Desert Cobblestone Red Slab=
Everness Glass Stair=
Everness Glass Slab=
Mineral Cave Stone Stair=
Mineral Cave Stone Slab=
Mineral Cave Cobblestone Stair=
Mineral Cave Cobblestone Slab=
Mineral Lava Stone with lava Stair=
Mineral Lava Stone with lava Slab=
Mineral Lava Stone without lava Stair=
Mineral Lava Stone without lava Slab=
Coral Bones Block Stair=
Coral Bones Block Slab=
Coral Bones Brick Stair=
Coral Bones Brick Slab=
Quartz Block Stair=Escalier en bloc de quartz
Quartz Block Slab=Dalle en bloc de quartz
Quartz Chiseled Stair=Escalier en quartz ciselé
Quartz Chiseled Slab=Dalle en quartz ciselé
Quartz Pillar Stair=Escalier en pilier de quartz
Quartz Pillar Slab=Dalle en pilier de quarte
Dry Wood Stair=Escalier en bois sec
Dry Wood Slab=Dalle en bois sec
Coral Wood Stair=
Coral Wood Slab=
Bamboo Wood Stair=Escalier en bois de bambou
Bamboo Wood Slab=Dalle en bois de bambou
Bamboo Mosaic Wood Stair=Escalier en mosaïque de bambou
Bamboo Mosaic Wood Slab=Dalle en mosaïque de bambou
Forsaken Desert Brick Stair=Escalier en brique de désert abandonné
Forsaken Desert Brick Slab=Dalle en brique de désert abandonné
Forsaken Desert Brick Red Stair=Escalier en brique rouge de désert abandonné
Forsaken Desert Brick Red Slab=Dalle en brique rouge de désert abandonné
Forsaken Desert Chiseled Stone Stair=Escalier en pierre ciselée de désert abandonné
Forsaken Desert Chiseled Stone Slab=Dalle en pierre ciselée de désert abandonné
Baobab Wood Stair=Escalier en bois de baobab
Baobab Wood Slab=Dalle en bois de baobab
Sequoia Wood Stair=Escalier en bois de Séquoia
Sequoia Wood Slab=Dalle en bois de Séquoia
Forsaken Tundra Cobblestone Stair=Escalier en pavé de toundra abandonnée
Forsaken Tundra Cobblestone Slab=Dalle en pavé de toundra abandonnée
Forsaken Tundra Stone Stair=Escalier en pierre de toundra abandonnée
Forsaken Tundra Stone Slab=Dalle en pierre de toundra abandonnée
Forsaken Tundra Brick Stair=Escalier en brique de toundra abandonnée
Forsaken Tundra Brick Slab=Dalle en brique de toundra abandonnée
Willow Wood Stair=Escalier en bois de saule
Willow Wood Slab=Dalle en bois de saule
Magma Cobblestone Stair=Escalier en pavé magmatique
Magma Cobblestone Slab=Dalle en pavé magmatique
Volcanic Rock Stair=Escalier en roche volcanique
Volcanic Rock Slab=Dalle en roche volcanique
Volcanic Rock with Magma Stair=Escalier en roche volcanique avec du magma
Volcanic Rock with Magma Slab=Dalle en roche volcanique avec du magma
Coral Depp Ocean Sandstone Block Stair=
Coral Depp Ocean Sandstone Block Slab=
Coral Depp Ocean Sandstone Brick Stair=
Coral Depp Ocean Sandstone Brick Slab=
Coral White Sandstone Stair=
Coral White Sandstone Slab=
Coral White Sandstone Pillar Stair=
Coral White Sandstone Pillar Slab=
Coral White Sandstone Brick Stair=
Coral White Sandstone Brick Slab=
Coral Desert Stone Block Stair=
Coral Desert Stone Block Slab=
Coral Desert Stone Brick Stair=
Coral Desert Stone Brick Slab=
Coral Sandstone Stair=
Coral Sandstone Slab=
Coral Sandstone Brick Stair=
Coral Sandstone Brick Slab=
Coral Sandstone Chiseled Stair=
Coral Sandstone Chiseled Slab=
Coral Sandstone Carved Stair=
Coral Sandstone Carved Slab=
Cursed Lands Deep Ocean Sandstone Block Stair=
Cursed Lands Deep Ocean Sandstone Block Slab=
Cursed Lands Deep Ocean Sandstone Brick Stair=
Cursed Lands Deep Ocean Sandstone Brick Slab=
Crystal Forest Deep Ocean Sandstone Block Stair=
Crystal Forest Deep Ocean Sandstone Block Slab=
Crystal Forest Deep Ocean Sandstone Brick Stair=
Crystal Forest Deep Ocean Sandstone Brick Slab=
Crystal Cobblestone Stair=
Crystal Cobblestone Slab=
Crystal Mossy Cobblestone Stair=
Crystal Mossy Cobblestone Slab=
Crystal Stone Brick Stair=
Crystal Stone Brick Slab=
Crystal Wood Stair=
Crystal Wood Slab=
Mese Wood Stair=
Mese Wood Slab=
Stair=
Slab=
Stone=
Cobblestone=
Block=
Brick=
Sandstone=
with Growth=
with Flower Growth=
Palm=
Wood=
Planks=
Tree=
Vine Shears=Cisailles à vigne
Silk Shovel=
Shell of Underwater Breating=
Hammer=
Sharp=
Torch=
Cave Vine=Vigne des cavernes
Whispering Gourd Vine=Gourde de vigne chuchotante
Bulb Vine=Vigne bulbeuse
Willow Vine=Vigne de saule
Eye Vine=Vigne oculaire
Lumabus Vine=Vigne luminescente
Ivis Vine=Vigne d'ivis
Flowered Vine=Vigne florissante
Reeds Vine=Vigne de roseaux
Tenanea Flowers Vine=
Twisted Vine=Vigne tordue
Golden Vine=Vigne d'or
Dense Vine=Vigne dense
Wall Cave Vine Green=
Wall Cave Vine Blue=
Wall Cave Vine Cyan=
Wall Cave Vine Violet=
Coral Bones Block Wall=
Coral Bones Brick Wall=
Crystal Cobblestone Wall=
Crystal Mossy Cobblestone Wall=
Cursed Sandstone Brick Wall=
Cursed Sandstone Block Wall=
Cursed Stone Carved Wall=
Forsaken Desert Cobblestone Wall=
Forsaken Desert Cobblestone Red Wall=
Forsaken Desert Brick Wall=
Forsaken Desert Brick Red Wall=
Forsaken Desert Engraved Stone Wall=
Mineral Cave Stone Wall=
Mineral Cave Cobblestone Wall=
Mineral Lava Stone with lava Wall=
Mineral Lava Stone without lava Wall=
Forsaken Desert Chiseled Stone=Pierre ciselée de désert abandonné
##### not used anymore #####
Cave Vine with Mese Leaves=Vigne des cavernes avec des feuille de Mese
+621
View File
@@ -0,0 +1,621 @@
# textdomain: everness
@1 will intersect protection on growth.=
Compost chance=
Everness Encyclopedia=
You need "everness_encyclopedia" privilige to access this button.=
Empty Bucket=
Get biome name where you are standing.=
This command can only be executed in-game!=
Locked Chest=
Locked Chest (owned by @1)=
You do not own this chest.=
a locked chest=
Chest=
Quartz Crystal=Kvarckristály
Baobab Roasted Fruit=Sült baobabgyümölcs
Pyrite Ingot=Piritrúd
Pyrite Lump=Piritrög
Bamboo=Bambusz
Hunger=
Coconut=
Coral Wood Fence Gate=
Lava Tree Wood Door=
Lava Tree Wood Trapdoor=
Lava Tree Wood Fence Gate=
Bamboo Wood Fence Gate=Bambusz kerítésajtó
Crystal Wood Fence Gate=
Palm Wood Fence Gate=
Bamboo Door=Bambuszajtó
Bamboo Trapdoor=Bambusz csapóajtó
Bone Pyrit Door=Csont-pirit ajtó
Willow Door=Fűzfaajtó
Crystal Wood Door=
Crystal Wood Trapdoor=
Cursed Wood Door=
Cursed Wood Trapdoor=
Palm Wood Door=
Palm Wood Trapdoor=
Dry Wood Fence Rail=Elszáradt fakerítés-rács
Dry Wood Mese Post Light=Elszáradt fa-mese-lámpa
Bamboo Wood Fence Rail=Bambusz fakerítés-rács
Bamboo Wood Mese Post Light=Bambusz fa-mese-lámpa
Crystal Wood Fence Rail=
Crystal Wood Mese Post Light=
Palm Wood Fence Rail=
Palm Wood Mese Post Light=
Coral Wood Fence=
Coral Wood Fence Rail=
Coral Wood Mese Post Light=
Lava Tree Wood Fence=
Lava Tree Wood Fence Rail=
Lava Tree Wood Mese Post Light=
Dry Wood Fence=Elszáradt fakerítés
Bamboo Wood Fence=Bambusz fakerítés
Crystal Wood Fence=
Palm Wood Fence=
Dry Wood Fence Gate=
Coral Desert Stone Stair=
Coral Desert Stone Slab=
Double Coral Desert Stone Slab=
Coral Desert Cobblestone Stair=
Coral Desert Cobblestone Slab=
Double Coral Desert Cobblestone Slab=
Coral Mossy Cobblestone Stair=
Coral Mossy Cobblestone Slab=
Double Coral Mossy Cobblestone Slab=
Cursed Brick Stair=
Cursed Brick Slab=
Double Cursed Brick Slab=
Cursed Brick with Growth Stair=
Cursed Brick with Growth Slab=
Double Cursed Brick with Growth Slab=
Double Coral Bones Block Slab=
Double Coral Bones Brick Slab=
Double Quartz Block Slab=
Double Quartz Chiseled Slab=
Double Quartz Pillar Slab=
Double Dry Wood Slab=
Double Coral Wood Slab=
Double Bamboo Wood Slab=
Double Bamboo Mosaic Wood Slab=
Double Forsaken Desert Brick Slab=
Double Forsaken Desert Brick Red Slab=
Double Forsaken Desert Chiseled Stone Slab=
Double Baobab Wood Slab=
Double Sequoia Wood Slab=
Double Forsaken Tundra Cobblestone Slab=
Double Forsaken Tundra Stone Slab=
Double Forsaken Tundra Brick Slab=
Double Willow Wood Slab=
Double Magma Cobblestone Slab=
Double Volcanic Rock Slab=
Double Volcanic Rock with Magma Slab=
Double Coral Depp Ocean Sandstone Block Slab=
Double Coral Depp Ocean Sandstone Brick Slab=
Double Coral White Sandstone Slab=
Double Coral White Sandstone Pillar Slab=
Double Coral White Sandstone Brick Slab=
Double Coral Desert Stone Block Slab=
Double Coral Desert Stone Brick Slab=
Double Coral Sandstone Slab=
Double Coral Sandstone Brick Slab=
Double Coral Sandstone Chiseled Slab=
Double Coral Sandstone Carved Slab=
Double Cursed Lands Deep Ocean Sandstone Block Slab=
Double Cursed Lands Deep Ocean Sandstone Brick Slab=
Double Crystal Forest Deep Ocean Sandstone Block Slab=
Double Crystal Forest Deep Ocean Sandstone Brick Slab=
Double Crystal Cobblestone Slab=
Double Crystal Mossy Cobblestone Slab=
Double Crystal Stone Brick Slab=
Double Crystal Wood Slab=
Double Mese Wood Slab=
Double=
A bucket can be used to collect and release liquids. This one is filled with mineral water.=
Place it to empty the bucket and create a mineral water source.=
Places a mineral water source=
Bucket=
Water=
Coral Cobblestone Wall=Korall macskakő-fal
Coral Mossy Cobblestone Wall=Korall macskakő-fal, mohos
Cursed Brick Wall=Elátkozott tégla-fal
Cursed Brick with Growth Wall=
Forsaken Tundra Cobblestone Wall=Elhagyatott tundrai macskakő-fal
Forsaken Tundra Stone Wall=Elhagyatott tundrai kőfal
Forsaken Tundra Brick Wall=Elhagyatott tundrai téglafal
Magma Cobblestone Wall=Magmás macskakő-fal
Volcanic Rock Wall=Vulkanikus kőzetfal
Volcanic Rock with Magma Wall=Magmás vulkanikus kőzetfal
Lava Bucket=
Mineral=
Coal Ore=
Pyrite Ore=Piritérc
Ceramic Sherds. Use archeological pickaxe to have a chance of getting various different sherds.=
Ceramic Sherds=
Pyrite Block=Piritblokk
Forged Pyrite Block=Kovácsolt piritblokk
Pyrite Brick=Pirittégla
Pyrite Slab Brick=Pirit lap-tégla
Pyrite Spiral=Pirit spirál
Pyrite Pillar Bottom=Pirit oszloptalapzat
Pyrite Pillar Middle=Piritoszlop
Pyrite Pillar Top=Pirit oszlopfő
Pyrite Pillar Small=Kis piritoszlop
Polished Pyrite Block=Csiszolt piritblokk
Quartz Ore=Kvarcérc
Coral Desert Stone=Korallsivatagi kő
Crystal Stone=
Coral Sandstone=
Coral Sandstone Brick=
Coral Sandstone Chiseled Block=
Coral Sandstone Carved Block=
Coral White Sandstone=
Coral White Sandstone Brick=
Coral White Sandstone Pillar=
Coral Desert Stone Block=
Coral Desert Stone Brick=
Coral Bones=Korallsivatagi csont
Coral Bones Block=
Coral Bones Brick=
Crystal Cobblestone=
Crystal Mossy Cobblestone=
Crystal Stone Brick=
Coral Desert Cobblestone=Korallsivatagi macskakő
Coral Mossy Cobblestone=Korallsivatagi macskakő, mohos
Coral Desert Stone with Moss=Korallsivatagi kő, mohos
Coral Deep Ocean Sandstone Block=
Coral Deep Ocean Sandstone Brick=
Cursed Lands Deep Ocean Sandstone Block=
Cursed Lands Deep Ocean Sandstone Brick=
Crystal Forest Deep Ocean Sandstone Block=
Crystal Forest Deep Ocean Sandstone Brick=
Forsaken Desert Stone=Elhagyatott sivatagi kő
Forsaken Desert Cobblestone Red=Elhagyatott sivatagi macskakő, vörös
Forsaken Desert Cobblestone=Elhagyatott sivatagi macskakő
Volcanic Rock=Vulkanikus kőzet
Volcanic Rock with Magma=Vulkanikus kőzet magmával
Cursed Stone=Elátkozott kő
Cursed Stone Carved=
Cursed Brick=Elátkozott tégla
Cursed Brick with Growth=
Cursed Brick Mixed=
Cursed Brick Carved=
Volcanic Sulfur Stone=Vulkanikus kénkő
Sulfur Stone=Kénkő
Forsaken Tundra Cobblestone=Elhagyatott tundrai macskakő
Forsaken Tundra Stone=Elhagyatott tundrai kő
Mold Cobble=Penészes macskakő
Forsaken Tundra Brick=Elhagyatott tundrai tégla
Forsaken Tundra Rocks=Elhagyatott tundrai kőzet
Blue Crying Obsidian=Sikoltó obszidián, kék
Blue Weeping Obsidian=Könnyező obszidián, kék
Weeping Obsidian=Könnyező obszidián
Mold Stone=Penészes kő
Soul Sandstone=Lélek-homokkő
Soul Sandstone Veined=Lélek-homokkő, erezett
Purple Crystal Block=Lila kristályblokk
Orange Crystal Block=Narancs kristályblokk
Cyan Crystal Block=
Quartz Block=Kvarckristály-blokk
Chiseled Quartz=Csiszolt kvarc
Quartz Pillar=Kvarcoszlop
Forsaken Desert Brick=Elhagyatott sivatagi tégla
Forsaken Desert Brick Red=Elhagyatott sivatagi tégla, vörös
Forsaken Desert Engraved Stone=Elhagyatott sivatagi kő, vésett
Crystal Sandstone=
Crystal Sandstone Brick=
Crystal Sandstone Chiseled=
Cursed Sandstone Block=
Cursed Sandstone Brick=
Coral Dirt=Korallföld
Coral Deep Ocean Mud=
Cursed Dirt=Elátkozott föld
Crystal Dirt=Kristályföld
Forsaken Tundra Dirt=Elhagyatott tundraföld
Forsaken Tundra Dirt with Grass=Elhagyatott tundraföld, füves
Dirt with Coral Grass=Föld, korallfüves
Dirt with Cursed Grass=Föld, elátkozott füves
Dirt with Crystal Grass=Föld, kristályfüves
Dry Ocean Dirt=Száraz óceánfenék-talaj
Gravel=
Permanent Fire=
Dirt=Föld
Dry Dirt=
Dirt with Dry Grass=
Dirt with Grass=Föld, fűvel
Crystal Cave Dirt=Kristálybarlangi föld
Crystal Cave Dirt with Moss=Kristálybarlangi föld, mohos
Moss Block=Mohablokk
Crystal Moss Block=Kristálymoha-blokk
Coral Sand=Korallhomok
Coral White Sand=Korallhomok, fehér
Cursed Sand=Elátkozott homok
Crystal Sand=Kristályhomok
Crystal Forest Deep Ocean Sand with Crack=
Forsaken Tundra Beach Sand=Elhagyatott tundraparti homok
Forsaken Tundra Beach Sand with Shells=Elhagyatott tundraparti homok, kagylós
Forsaken Desert Sand=Elhagyatott sivatagi homok
Coral Forest Deep Ocean Sand=
Cursed Lands Deep Ocean Sand=
Cursed Lands Deep Ocean Sand with Crack=
Crystal Forest Deep Ocean Sand=
Mineral Sand=
Frosted Snow Block=Fagyalt hóblokk
Frosted Ice=Fagyalt jég
Frosted Ice Translucent=Fagyalt jég, átlátszó
Frosted Cave Ice=Fagyalt jég, barlangi
Bone=Csont
Ancient Emerald Ice=Ősi smaragdjég
Dense Emerald Ice=Sűrű smaragdjég
Emerald Ice=Smaragdjég
Cursed Mud=Elátkozott sár
Cobweb=Pókháló
Cave Flower=Barlangi virág
Cave Flower with Particles=Barlangi virág, szemcsés
Lotus=
Flower=
Animated=
Leaf=
Dry=
Forsaken Fire=Elhagyatott tűz
Coral Tree Trunk=Korallfa-törzs
Coral Wood Planks=
Coral Tree Bioluminescent=Korallfa, biolumineszcens
Cursed Dream Stone=Elátkozott álomkő
Dry Tree Trunk=Elszáradt fatörzs
Baobab Tree Trunk=Baobabfa-törzs
Sequoia Tree Trunk=Mammutfenyő-törzs
Willow Tree Trunk=Fűzfa-törzs
Willow Wood Planks=Fűzfa-palánk
Dry Wood Planks=Elszáradt palánk
Hollow Tree Trunk=Üregesfa-törzs
Crystal Tree Trunk=Kristályfa-törzs
Crystal Wood Planks=
Mese Tree Trunk=Mesefa-törzs
Trunk=
Mese Tree Leaves=
Baobab Tree Leaves=Baobabfa-lomb
Sequoia Tree Leaves=Mammutfenyő-lomb
Baobab Fruit=baobabgyümölcs
Baobab Fruit Marker=baobabgyümölcs-jelölő
Baobab Sapling=Baobab-palánta
Willow Tree Leaves=Fűzfa-lomb
Coral Tree Leaves=Korallfa-lomb
Dry Tree Branches=Elszáradt faág
Crystal Tree Leaves=Kristályfa-lomb
Coral Tree Sapling=Korallfa-palánta
Coral Tree Bioluminescent Sapling=Korallfa-palánta, biolumineszcens
Dry Tree Sapling=Elszáradt fa-palánta
Cursed Dream Tree Sapling=Elátkozott álomfa-palánta
Willow Tree Sapling=
Sequoia Tree Sapling=Mammutfenyő-palánta
Crystal Tree Sapling=Kristályfa-palánta
Crystal Tree Large Sapling=Kristályfa-palánta, nagy
Crystal Bush Stem=Kristálybokor-törzs
Crystal Bush Leaves=Kristálybokor-lomb
Crystal Bush Sapling=Kristálybokor-palánta
Cursed Bush Stem=Elátkozott bokor-törzs
Cursed Bush Leaves=Elátkozott bokor-lomb
Cursed Bush Sapling=Elátkozott bokor-palánta
Flowers=
Magenta Flowers=
Clover=
Luminous Mushroom=
Glossy Mushroom=
Staghorn Coral (Stage 1)=
Staghorn Coral (Stage 2)=
Staghorn Coral (Stage 3)=
Clover with flowers=
Aurora Violet=
Aurora Sky Blue=
Aurora Cyan=
Aurora Mint=
Aurora Lavender=
Aurora Lime=
Aurora Coral=
Aurora Magenta=
Glass Crystal Cluster=
Glass Megalith Foundation=
Glass Megalith Lower Shaft=
Glass Megalith Mid Nexus=
Glass Megalith Upper Spire=
Glass Megalith Summit Needle=
Coral Burdock=Korallbojtorján
Coral Bush=Korallbokor
Coral Shrub=Korallbozót
Orange Coral Grass=Narancs korallfű
Globulagus=Golyós eukaliptusz
Tall Coral Grass=Magas korallfű
Purple Crystal=Lila kristály
Orange Crystal=Narancs kristály
Cyan Crystal=Cián kristály
Coral Plant Bioluminescent=Korallnövény, biolumineszcens
Blooming Cooksonia=Virágzó májmoha
Creeping Moss Spores=Kúszómoha-spóra
Frosted Icicle=Fagyalt jégcsap
Frosted Icicle Floor=Fagyalt jégcsap-padló
Coral Grass=Korallfű
Baobab Savanna Grass=
Red Castor=Vörös ricinus
Crystal Mushrooms=Kristálygomba
Twisted Crystal Grass=Csavarodott kristályfű
Twisted Crystal Spire=
Crystal Grass=Kristályfű
Marsh Grass=Mocsári fű
Forsaken Plant=Elhagyatott növény
Blue Cactus=Kék kaktusz
Cave Barrel Cactus=Barlangi hordókaktusz
Venus Trap Plant=Vénusz légycsapó
Illumi Root=Illumi-gyökér
Crystal Waterlily=Kristály-vízililiom
Orange Cactus=Narancssárga kaktusz
Agave Leaf=Agave-lomb
Mese Fruit=
Mese Tree Sapling=
Egg plant=Padlizsán
Ivis Moss=Ivis-moha
Ngrass=N-fű
Bamboo Sprout=Bambuszrügy
Blood Spoore Plant=Vérspóra-növény
Blood Spoore Plant Small=Vérspóra-növény, kicsi
Termite Block=Termeszblokk
Bamboo Block=Bambuszblokk
Bamboo Planks=Bambuszpalánk
Bamboo Mosaic=Bambuszmozaik
Baobab Wood Planks=Baobabfa-palánk
Sequoia Wood Planks=Mammutfenyő-palánk
Mese Wood Planks=
Coral Corals=Korall
Coral Frosted=Korall, fagyalt
Coral Starfish=Korall-csillaghal
Spine Kelp=Gerinchínár
Coral Bulbs=
Coral Tree=
Coral Palm=
Coral Anemone=
Coral Darkilluma=
Coral Demon=
Crystal Forest Deep Ocean Coral Plant Cyan=
Crystal Forest Deep Ocean Coral Plant Orange=
Crystal Forest Deep Ocean Coral Plant Pink=
Crystal Coral Dark=Kristálykorall, sötét
Crystal Coral Light=Kristálykorall, világos
Coral Forest Deep Ocean Coral Pink=
Coral Forest Deep Ocean Coral Cyan=
Coral Forest Deep Ocean Coral Green=
Coral Forest Deep Ocean Coral Red=
Coral Alcyonacea=
Coral Ostracod=
Coral Octocurse=
Crystal Forest Deep Ocean Coral Green=
Crystal Forest Deep Ocean Coral Orange=
Crystal Forest Deep Ocean Coral Cyan=
Coral Skeleton=
Mineral Water Weed=
Skull with Candle=Koponya gyertyával
Forsythia Bush=Forsythia-bokor
Rose Bush=
Glowing Pillar=Izzó oszlop
Blue Vine Lantern=Kék inda-lámpás
Amaranita Lantern=Amaranita-lámpás
Lumecorn=Lume-mag
Everness Glass=
Tinted Glass Red=Színezett üveg, vörös
Pyrite Lantern=Piritlámpás
Pyrite Glass=Piritüveg
Lumabus Vine Lantern=Lumabus-inda lámpás
Eye Vine Lantern=Szem-inda lámpás
Cursed Pumpkin Lantern=Elátkozott töklámpás
Floating Crystal=Lebegő kristály
Coral Forest Deep Ocean Lantern=
Mineral Water Source=
Flowing Mineral Water=
Lava Source=
Flowing Lava=
Geyser=
Active=
Ceramic=
Pot=
If destroyed by archelogical pick axe, it will drop ceramic sherds instead of ceramic pot item.=
owned by=
Sherd=
Sand=
Castle=
Wall=
Purple=
Green=
Red=
Blue=
Yellow=
Magenta=
Cyan=
White=
Cursed Skeleton Hands=
Cursed Rib Cage=
Cursed Skull on Stick=
Coral Dirt Soil=
Dirt Soil=
Crystal Dirt Soil=
Crystal Cave Dirt Soil=
Cursed Dirt Soil=
Dry Dirt Soil=
Coral Dirt Wet Soil=
Crystal Dirt Wet Soil=
Crystal Cave Dirt Wet Soil=
Cursed Dirt Wet Soil=
Mineral Cave Stone=
Mineral Cave Cobblestone=
Mineral Lava Stone with lava=
Mineral Lava Stone without lava=
Mineral Lava Stone with moss=
Volcanic Spike=
Mineral Lava Stone Spike=
Lava Tree Trunk=
Lava Tree Trunk with Lava Veins=
Lava Tree Wood Planks=
Lava=
Mineral Cave Moss Grass=
Sapling=
Leaves=
Pyrite Glass Pane=Piritüveg-lap
Cursed Steel Bars=
Cursed Steel Bar Door=
Steel Bar Trapdoor=
Dry Tree Trunk Stair=
Dry Tree Trunk Slab=
Forsaken Desert Engraved Stone Stair=
Forsaken Desert Engraved Stone Slab=
Forsaken Desert Cobblestone Stair=
Forsaken Desert Cobblestone Slab=
Forsaken Desert Cobblestone Red Stair=
Forsaken Desert Cobblestone Red Slab=
Everness Glass Stair=
Everness Glass Slab=
Mineral Cave Stone Stair=
Mineral Cave Stone Slab=
Mineral Cave Cobblestone Stair=
Mineral Cave Cobblestone Slab=
Mineral Lava Stone with lava Stair=
Mineral Lava Stone with lava Slab=
Mineral Lava Stone without lava Stair=
Mineral Lava Stone without lava Slab=
Coral Bones Block Stair=
Coral Bones Block Slab=
Coral Bones Brick Stair=
Coral Bones Brick Slab=
Quartz Block Stair=Csiszolt blokk-lépcső
Quartz Block Slab=Csiszolt blokk-kő
Quartz Chiseled Stair=Csiszolt kvarc-lépcső
Quartz Chiseled Slab=Csiszolt kvarc-lap
Quartz Pillar Stair=Kvarcoszlop-lépcső
Quartz Pillar Slab=Kvarcoszlop-lap
Dry Wood Stair=Elszáradt fa-lépcső
Dry Wood Slab=Elszáradt fa-lap
Coral Wood Stair=
Coral Wood Slab=
Bamboo Wood Stair=Bambusz fa-lépcső
Bamboo Wood Slab=Bambusz fa-lap
Bamboo Mosaic Wood Stair=Bambuszmozaik fa-lépcső
Bamboo Mosaic Wood Slab=Bambuszmozaik fa-lap
Forsaken Desert Brick Stair=Elhagyatott sivatagi tégla-lépcső
Forsaken Desert Brick Slab=Elhagyatott sivatagi tégla-lap
Forsaken Desert Brick Red Stair=Elhagyatott sivatagi tégla-lépcső, vörös
Forsaken Desert Brick Red Slab=Elhagyatott sivatagi tégla-lap, vörös
Forsaken Desert Chiseled Stone Stair=Elhagyatott sivatagi csiszolt kő-lépcső
Forsaken Desert Chiseled Stone Slab=Elhagyatott sivatagi csiszolt kő-lap
Baobab Wood Stair=Baobabfa-lépcső
Baobab Wood Slab=Baobabfa-lap
Sequoia Wood Stair=Mammutfenyő-lépcső
Sequoia Wood Slab=Mammutfenyő-lap
Forsaken Tundra Cobblestone Stair=Elhagyatott tundrai macskakő-lépcs
Forsaken Tundra Cobblestone Slab=Elhagyatott tundrai macskakő-lap
Forsaken Tundra Stone Stair=Elhagyatott tundrai kő-lépcső
Forsaken Tundra Stone Slab=Elhagyatott tundrai kő-lap
Forsaken Tundra Brick Stair=Elhagyatott tundrai tégla-lépcső
Forsaken Tundra Brick Slab=Elhagyatott tundrai tégla-lap
Willow Wood Stair=Fűzfa-lépcső
Willow Wood Slab=Fűzfa-lap
Magma Cobblestone Stair=Magmás macskakő-lépcső
Magma Cobblestone Slab=Magmás macskakő-lap
Volcanic Rock Stair=Vulkanikus kőzet-lépcső
Volcanic Rock Slab=Vulkanikus kőzet-lap
Volcanic Rock with Magma Stair=Magmás vulkanikus kőzet-lépcső
Volcanic Rock with Magma Slab=Magmás vulkanikus kőzet-lap
Coral Depp Ocean Sandstone Block Stair=
Coral Depp Ocean Sandstone Block Slab=
Coral Depp Ocean Sandstone Brick Stair=
Coral Depp Ocean Sandstone Brick Slab=
Coral White Sandstone Stair=
Coral White Sandstone Slab=
Coral White Sandstone Pillar Stair=
Coral White Sandstone Pillar Slab=
Coral White Sandstone Brick Stair=
Coral White Sandstone Brick Slab=
Coral Desert Stone Block Stair=
Coral Desert Stone Block Slab=
Coral Desert Stone Brick Stair=
Coral Desert Stone Brick Slab=
Coral Sandstone Stair=
Coral Sandstone Slab=
Coral Sandstone Brick Stair=
Coral Sandstone Brick Slab=
Coral Sandstone Chiseled Stair=
Coral Sandstone Chiseled Slab=
Coral Sandstone Carved Stair=
Coral Sandstone Carved Slab=
Cursed Lands Deep Ocean Sandstone Block Stair=
Cursed Lands Deep Ocean Sandstone Block Slab=
Cursed Lands Deep Ocean Sandstone Brick Stair=
Cursed Lands Deep Ocean Sandstone Brick Slab=
Crystal Forest Deep Ocean Sandstone Block Stair=
Crystal Forest Deep Ocean Sandstone Block Slab=
Crystal Forest Deep Ocean Sandstone Brick Stair=
Crystal Forest Deep Ocean Sandstone Brick Slab=
Crystal Cobblestone Stair=
Crystal Cobblestone Slab=
Crystal Mossy Cobblestone Stair=
Crystal Mossy Cobblestone Slab=
Crystal Stone Brick Stair=
Crystal Stone Brick Slab=
Crystal Wood Stair=
Crystal Wood Slab=
Mese Wood Stair=
Mese Wood Slab=
Stair=
Slab=
Stone=
Cobblestone=
Block=
Brick=
Sandstone=
with Growth=
with Flower Growth=
Palm=
Wood=
Planks=
Tree=
Vine Shears=Inda-metszőolló
Silk Shovel=
Shell of Underwater Breating=
Hammer=
Sharp=
Torch=
Cave Vine=Barlangi inda
Whispering Gourd Vine=Suttogó tök-inda
Bulb Vine=Rügyező inda
Willow Vine=Fűzfainda
Eye Vine=Szem-inda
Lumabus Vine=Lumabus-inda
Ivis Vine=Ivis-inda
Flowered Vine=Virágzó inda
Reeds Vine=Nádinda
Tenanea Flowers Vine=
Twisted Vine=Csavarodott inda
Golden Vine=Arany inda
Dense Vine=Sűrű inda
Wall Cave Vine Green=
Wall Cave Vine Blue=
Wall Cave Vine Cyan=
Wall Cave Vine Violet=
Coral Bones Block Wall=
Coral Bones Brick Wall=
Crystal Cobblestone Wall=
Crystal Mossy Cobblestone Wall=
Cursed Sandstone Brick Wall=
Cursed Sandstone Block Wall=
Cursed Stone Carved Wall=
Forsaken Desert Cobblestone Wall=
Forsaken Desert Cobblestone Red Wall=
Forsaken Desert Brick Wall=
Forsaken Desert Brick Red Wall=
Forsaken Desert Engraved Stone Wall=
Mineral Cave Stone Wall=
Mineral Cave Cobblestone Wall=
Mineral Lava Stone with lava Wall=
Mineral Lava Stone without lava Wall=
Forsaken Desert Chiseled Stone=Elhagyatott sivatagi kő, csiszolt
##### not used anymore #####
Cave Vine with Mese Leaves=Barlangi inda mese-levelekkel
+616
View File
@@ -0,0 +1,616 @@
# textdomain: everness
@1 will intersect protection on growth.=
Compost chance=
Everness Encyclopedia=
You need "everness_encyclopedia" privilige to access this button.=
Empty Bucket=
Get biome name where you are standing.=
This command can only be executed in-game!=
Locked Chest=
Locked Chest (owned by @1)=
You do not own this chest.=
a locked chest=
Chest=
Quartz Crystal=
Baobab Roasted Fruit=
Pyrite Ingot=
Pyrite Lump=
Bamboo=
Hunger=
Coconut=
Coral Wood Fence Gate=
Lava Tree Wood Door=
Lava Tree Wood Trapdoor=
Lava Tree Wood Fence Gate=
Bamboo Wood Fence Gate=
Crystal Wood Fence Gate=
Palm Wood Fence Gate=
Bamboo Door=
Bamboo Trapdoor=
Bone Pyrit Door=
Willow Door=
Crystal Wood Door=
Crystal Wood Trapdoor=
Cursed Wood Door=
Cursed Wood Trapdoor=
Palm Wood Door=
Palm Wood Trapdoor=
Dry Wood Fence Rail=
Dry Wood Mese Post Light=
Bamboo Wood Fence Rail=
Bamboo Wood Mese Post Light=
Crystal Wood Fence Rail=
Crystal Wood Mese Post Light=
Palm Wood Fence Rail=
Palm Wood Mese Post Light=
Coral Wood Fence=
Coral Wood Fence Rail=
Coral Wood Mese Post Light=
Lava Tree Wood Fence=
Lava Tree Wood Fence Rail=
Lava Tree Wood Mese Post Light=
Dry Wood Fence=
Bamboo Wood Fence=
Crystal Wood Fence=
Palm Wood Fence=
Dry Wood Fence Gate=
Coral Desert Stone Stair=
Coral Desert Stone Slab=
Double Coral Desert Stone Slab=
Coral Desert Cobblestone Stair=
Coral Desert Cobblestone Slab=
Double Coral Desert Cobblestone Slab=
Coral Mossy Cobblestone Stair=
Coral Mossy Cobblestone Slab=
Double Coral Mossy Cobblestone Slab=
Cursed Brick Stair=
Cursed Brick Slab=
Double Cursed Brick Slab=
Cursed Brick with Growth Stair=
Cursed Brick with Growth Slab=
Double Cursed Brick with Growth Slab=
Double Coral Bones Block Slab=
Double Coral Bones Brick Slab=
Double Quartz Block Slab=
Double Quartz Chiseled Slab=
Double Quartz Pillar Slab=
Double Dry Wood Slab=
Double Coral Wood Slab=
Double Bamboo Wood Slab=
Double Bamboo Mosaic Wood Slab=
Double Forsaken Desert Brick Slab=
Double Forsaken Desert Brick Red Slab=
Double Forsaken Desert Chiseled Stone Slab=
Double Baobab Wood Slab=
Double Sequoia Wood Slab=
Double Forsaken Tundra Cobblestone Slab=
Double Forsaken Tundra Stone Slab=
Double Forsaken Tundra Brick Slab=
Double Willow Wood Slab=
Double Magma Cobblestone Slab=
Double Volcanic Rock Slab=
Double Volcanic Rock with Magma Slab=
Double Coral Depp Ocean Sandstone Block Slab=
Double Coral Depp Ocean Sandstone Brick Slab=
Double Coral White Sandstone Slab=
Double Coral White Sandstone Pillar Slab=
Double Coral White Sandstone Brick Slab=
Double Coral Desert Stone Block Slab=
Double Coral Desert Stone Brick Slab=
Double Coral Sandstone Slab=
Double Coral Sandstone Brick Slab=
Double Coral Sandstone Chiseled Slab=
Double Coral Sandstone Carved Slab=
Double Cursed Lands Deep Ocean Sandstone Block Slab=
Double Cursed Lands Deep Ocean Sandstone Brick Slab=
Double Crystal Forest Deep Ocean Sandstone Block Slab=
Double Crystal Forest Deep Ocean Sandstone Brick Slab=
Double Crystal Cobblestone Slab=
Double Crystal Mossy Cobblestone Slab=
Double Crystal Stone Brick Slab=
Double Crystal Wood Slab=
Double Mese Wood Slab=
Double=
A bucket can be used to collect and release liquids. This one is filled with mineral water.=
Place it to empty the bucket and create a mineral water source.=
Places a mineral water source=
Bucket=
Water=
Coral Cobblestone Wall=
Coral Mossy Cobblestone Wall=
Cursed Brick Wall=
Cursed Brick with Growth Wall=
Forsaken Tundra Cobblestone Wall=
Forsaken Tundra Stone Wall=
Forsaken Tundra Brick Wall=
Magma Cobblestone Wall=
Volcanic Rock Wall=
Volcanic Rock with Magma Wall=
Lava Bucket=
Mineral=
Coal Ore=
Pyrite Ore=
Ceramic Sherds. Use archeological pickaxe to have a chance of getting various different sherds.=
Ceramic Sherds=
Pyrite Block=
Forged Pyrite Block=
Pyrite Brick=
Pyrite Slab Brick=
Pyrite Spiral=
Pyrite Pillar Bottom=
Pyrite Pillar Middle=
Pyrite Pillar Top=
Pyrite Pillar Small=
Polished Pyrite Block=
Quartz Ore=
Coral Desert Stone=
Crystal Stone=
Coral Sandstone=
Coral Sandstone Brick=
Coral Sandstone Chiseled Block=
Coral Sandstone Carved Block=
Coral White Sandstone=
Coral White Sandstone Brick=
Coral White Sandstone Pillar=
Coral Desert Stone Block=
Coral Desert Stone Brick=
Coral Bones=
Coral Bones Block=
Coral Bones Brick=
Crystal Cobblestone=
Crystal Mossy Cobblestone=
Crystal Stone Brick=
Coral Desert Cobblestone=
Coral Mossy Cobblestone=
Coral Desert Stone with Moss=
Coral Deep Ocean Sandstone Block=
Coral Deep Ocean Sandstone Brick=
Cursed Lands Deep Ocean Sandstone Block=
Cursed Lands Deep Ocean Sandstone Brick=
Crystal Forest Deep Ocean Sandstone Block=
Crystal Forest Deep Ocean Sandstone Brick=
Forsaken Desert Stone=
Forsaken Desert Cobblestone Red=
Forsaken Desert Cobblestone=
Volcanic Rock=
Volcanic Rock with Magma=
Cursed Stone=
Cursed Stone Carved=
Cursed Brick=
Cursed Brick with Growth=
Cursed Brick Mixed=
Cursed Brick Carved=
Volcanic Sulfur Stone=
Sulfur Stone=
Forsaken Tundra Cobblestone=
Forsaken Tundra Stone=
Mold Cobble=
Forsaken Tundra Brick=
Forsaken Tundra Rocks=
Blue Crying Obsidian=
Blue Weeping Obsidian=
Weeping Obsidian=
Mold Stone=
Soul Sandstone=
Soul Sandstone Veined=
Purple Crystal Block=
Orange Crystal Block=
Cyan Crystal Block=
Quartz Block=
Chiseled Quartz=
Quartz Pillar=
Forsaken Desert Brick=
Forsaken Desert Brick Red=
Forsaken Desert Engraved Stone=
Crystal Sandstone=
Crystal Sandstone Brick=
Crystal Sandstone Chiseled=
Cursed Sandstone Block=
Cursed Sandstone Brick=
Coral Dirt=
Coral Deep Ocean Mud=
Cursed Dirt=
Crystal Dirt=
Forsaken Tundra Dirt=
Forsaken Tundra Dirt with Grass=
Dirt with Coral Grass=
Dirt with Cursed Grass=
Dirt with Crystal Grass=
Dry Ocean Dirt=
Gravel=
Permanent Fire=
Dirt=
Dry Dirt=
Dirt with Dry Grass=
Dirt with Grass=
Crystal Cave Dirt=
Crystal Cave Dirt with Moss=
Moss Block=
Crystal Moss Block=
Coral Sand=
Coral White Sand=
Cursed Sand=
Crystal Sand=
Crystal Forest Deep Ocean Sand with Crack=
Forsaken Tundra Beach Sand=
Forsaken Tundra Beach Sand with Shells=
Forsaken Desert Sand=
Coral Forest Deep Ocean Sand=
Cursed Lands Deep Ocean Sand=
Cursed Lands Deep Ocean Sand with Crack=
Crystal Forest Deep Ocean Sand=
Mineral Sand=
Frosted Snow Block=
Frosted Ice=
Frosted Ice Translucent=
Frosted Cave Ice=
Bone=
Ancient Emerald Ice=
Dense Emerald Ice=
Emerald Ice=
Cursed Mud=
Cobweb=
Cave Flower=
Cave Flower with Particles=
Lotus=
Flower=
Animated=
Leaf=
Dry=
Forsaken Fire=
Coral Tree Trunk=
Coral Wood Planks=
Coral Tree Bioluminescent=
Cursed Dream Stone=
Dry Tree Trunk=
Baobab Tree Trunk=
Sequoia Tree Trunk=
Willow Tree Trunk=
Willow Wood Planks=
Dry Wood Planks=
Hollow Tree Trunk=
Crystal Tree Trunk=
Crystal Wood Planks=
Mese Tree Trunk=
Trunk=
Mese Tree Leaves=
Baobab Tree Leaves=
Sequoia Tree Leaves=
Baobab Fruit=
Baobab Fruit Marker=
Baobab Sapling=
Willow Tree Leaves=
Coral Tree Leaves=
Dry Tree Branches=
Crystal Tree Leaves=
Coral Tree Sapling=
Coral Tree Bioluminescent Sapling=
Dry Tree Sapling=
Cursed Dream Tree Sapling=
Willow Tree Sapling=
Sequoia Tree Sapling=
Crystal Tree Sapling=
Crystal Tree Large Sapling=
Crystal Bush Stem=
Crystal Bush Leaves=
Crystal Bush Sapling=
Cursed Bush Stem=
Cursed Bush Leaves=
Cursed Bush Sapling=
Flowers=
Magenta Flowers=
Clover=
Luminous Mushroom=
Glossy Mushroom=
Staghorn Coral (Stage 1)=
Staghorn Coral (Stage 2)=
Staghorn Coral (Stage 3)=
Clover with flowers=
Aurora Violet=
Aurora Sky Blue=
Aurora Cyan=
Aurora Mint=
Aurora Lavender=
Aurora Lime=
Aurora Coral=
Aurora Magenta=
Glass Crystal Cluster=
Glass Megalith Foundation=
Glass Megalith Lower Shaft=
Glass Megalith Mid Nexus=
Glass Megalith Upper Spire=
Glass Megalith Summit Needle=
Coral Burdock=
Coral Bush=
Coral Shrub=
Orange Coral Grass=
Globulagus=
Tall Coral Grass=
Purple Crystal=
Orange Crystal=
Cyan Crystal=
Coral Plant Bioluminescent=
Blooming Cooksonia=
Creeping Moss Spores=
Frosted Icicle=
Frosted Icicle Floor=
Coral Grass=
Baobab Savanna Grass=
Red Castor=
Crystal Mushrooms=
Twisted Crystal Grass=
Twisted Crystal Spire=
Crystal Grass=
Marsh Grass=
Forsaken Plant=
Blue Cactus=
Cave Barrel Cactus=
Venus Trap Plant=
Illumi Root=
Crystal Waterlily=
Orange Cactus=
Agave Leaf=
Mese Fruit=
Mese Tree Sapling=
Egg plant=
Ivis Moss=
Ngrass=
Bamboo Sprout=
Blood Spoore Plant=
Blood Spoore Plant Small=
Termite Block=
Bamboo Block=
Bamboo Planks=
Bamboo Mosaic=
Baobab Wood Planks=
Sequoia Wood Planks=
Mese Wood Planks=
Coral Corals=
Coral Frosted=
Coral Starfish=
Spine Kelp=
Coral Bulbs=
Coral Tree=
Coral Palm=
Coral Anemone=
Coral Darkilluma=
Coral Demon=
Crystal Forest Deep Ocean Coral Plant Cyan=
Crystal Forest Deep Ocean Coral Plant Orange=
Crystal Forest Deep Ocean Coral Plant Pink=
Crystal Coral Dark=
Crystal Coral Light=
Coral Forest Deep Ocean Coral Pink=
Coral Forest Deep Ocean Coral Cyan=
Coral Forest Deep Ocean Coral Green=
Coral Forest Deep Ocean Coral Red=
Coral Alcyonacea=
Coral Ostracod=
Coral Octocurse=
Crystal Forest Deep Ocean Coral Green=
Crystal Forest Deep Ocean Coral Orange=
Crystal Forest Deep Ocean Coral Cyan=
Coral Skeleton=
Mineral Water Weed=
Skull with Candle=
Forsythia Bush=
Rose Bush=
Glowing Pillar=
Blue Vine Lantern=
Amaranita Lantern=
Lumecorn=
Everness Glass=
Tinted Glass Red=
Pyrite Lantern=
Pyrite Glass=
Lumabus Vine Lantern=
Eye Vine Lantern=
Cursed Pumpkin Lantern=
Floating Crystal=
Coral Forest Deep Ocean Lantern=
Mineral Water Source=
Flowing Mineral Water=
Lava Source=
Flowing Lava=
Geyser=
Active=
Ceramic=
Pot=
If destroyed by archelogical pick axe, it will drop ceramic sherds instead of ceramic pot item.=
owned by=
Sherd=
Sand=
Castle=
Wall=
Purple=
Green=
Red=
Blue=
Yellow=
Magenta=
Cyan=
White=
Cursed Skeleton Hands=
Cursed Rib Cage=
Cursed Skull on Stick=
Coral Dirt Soil=
Dirt Soil=
Crystal Dirt Soil=
Crystal Cave Dirt Soil=
Cursed Dirt Soil=
Dry Dirt Soil=
Coral Dirt Wet Soil=
Crystal Dirt Wet Soil=
Crystal Cave Dirt Wet Soil=
Cursed Dirt Wet Soil=
Mineral Cave Stone=
Mineral Cave Cobblestone=
Mineral Lava Stone with lava=
Mineral Lava Stone without lava=
Mineral Lava Stone with moss=
Volcanic Spike=
Mineral Lava Stone Spike=
Lava Tree Trunk=
Lava Tree Trunk with Lava Veins=
Lava Tree Wood Planks=
Lava=
Mineral Cave Moss Grass=
Sapling=
Leaves=
Pyrite Glass Pane=
Cursed Steel Bars=
Cursed Steel Bar Door=
Steel Bar Trapdoor=
Dry Tree Trunk Stair=
Dry Tree Trunk Slab=
Forsaken Desert Engraved Stone Stair=
Forsaken Desert Engraved Stone Slab=
Forsaken Desert Cobblestone Stair=
Forsaken Desert Cobblestone Slab=
Forsaken Desert Cobblestone Red Stair=
Forsaken Desert Cobblestone Red Slab=
Everness Glass Stair=
Everness Glass Slab=
Mineral Cave Stone Stair=
Mineral Cave Stone Slab=
Mineral Cave Cobblestone Stair=
Mineral Cave Cobblestone Slab=
Mineral Lava Stone with lava Stair=
Mineral Lava Stone with lava Slab=
Mineral Lava Stone without lava Stair=
Mineral Lava Stone without lava Slab=
Coral Bones Block Stair=
Coral Bones Block Slab=
Coral Bones Brick Stair=
Coral Bones Brick Slab=
Quartz Block Stair=
Quartz Block Slab=
Quartz Chiseled Stair=
Quartz Chiseled Slab=
Quartz Pillar Stair=
Quartz Pillar Slab=
Dry Wood Stair=
Dry Wood Slab=
Coral Wood Stair=
Coral Wood Slab=
Bamboo Wood Stair=
Bamboo Wood Slab=
Bamboo Mosaic Wood Stair=
Bamboo Mosaic Wood Slab=
Forsaken Desert Brick Stair=
Forsaken Desert Brick Slab=
Forsaken Desert Brick Red Stair=
Forsaken Desert Brick Red Slab=
Forsaken Desert Chiseled Stone Stair=
Forsaken Desert Chiseled Stone Slab=
Baobab Wood Stair=
Baobab Wood Slab=
Sequoia Wood Stair=
Sequoia Wood Slab=
Forsaken Tundra Cobblestone Stair=
Forsaken Tundra Cobblestone Slab=
Forsaken Tundra Stone Stair=
Forsaken Tundra Stone Slab=
Forsaken Tundra Brick Stair=
Forsaken Tundra Brick Slab=
Willow Wood Stair=
Willow Wood Slab=
Magma Cobblestone Stair=
Magma Cobblestone Slab=
Volcanic Rock Stair=
Volcanic Rock Slab=
Volcanic Rock with Magma Stair=
Volcanic Rock with Magma Slab=
Coral Depp Ocean Sandstone Block Stair=
Coral Depp Ocean Sandstone Block Slab=
Coral Depp Ocean Sandstone Brick Stair=
Coral Depp Ocean Sandstone Brick Slab=
Coral White Sandstone Stair=
Coral White Sandstone Slab=
Coral White Sandstone Pillar Stair=
Coral White Sandstone Pillar Slab=
Coral White Sandstone Brick Stair=
Coral White Sandstone Brick Slab=
Coral Desert Stone Block Stair=
Coral Desert Stone Block Slab=
Coral Desert Stone Brick Stair=
Coral Desert Stone Brick Slab=
Coral Sandstone Stair=
Coral Sandstone Slab=
Coral Sandstone Brick Stair=
Coral Sandstone Brick Slab=
Coral Sandstone Chiseled Stair=
Coral Sandstone Chiseled Slab=
Coral Sandstone Carved Stair=
Coral Sandstone Carved Slab=
Cursed Lands Deep Ocean Sandstone Block Stair=
Cursed Lands Deep Ocean Sandstone Block Slab=
Cursed Lands Deep Ocean Sandstone Brick Stair=
Cursed Lands Deep Ocean Sandstone Brick Slab=
Crystal Forest Deep Ocean Sandstone Block Stair=
Crystal Forest Deep Ocean Sandstone Block Slab=
Crystal Forest Deep Ocean Sandstone Brick Stair=
Crystal Forest Deep Ocean Sandstone Brick Slab=
Crystal Cobblestone Stair=
Crystal Cobblestone Slab=
Crystal Mossy Cobblestone Stair=
Crystal Mossy Cobblestone Slab=
Crystal Stone Brick Stair=
Crystal Stone Brick Slab=
Crystal Wood Stair=
Crystal Wood Slab=
Mese Wood Stair=
Mese Wood Slab=
Stair=
Slab=
Stone=
Cobblestone=
Block=
Brick=
Sandstone=
with Growth=
with Flower Growth=
Palm=
Wood=
Planks=
Tree=
Vine Shears=
Silk Shovel=
Shell of Underwater Breating=
Hammer=
Sharp=
Torch=
Cave Vine=
Whispering Gourd Vine=
Bulb Vine=
Willow Vine=
Eye Vine=
Lumabus Vine=
Ivis Vine=
Flowered Vine=
Reeds Vine=
Tenanea Flowers Vine=
Twisted Vine=
Golden Vine=
Dense Vine=
Wall Cave Vine Green=
Wall Cave Vine Blue=
Wall Cave Vine Cyan=
Wall Cave Vine Violet=
Coral Bones Block Wall=
Coral Bones Brick Wall=
Crystal Cobblestone Wall=
Crystal Mossy Cobblestone Wall=
Cursed Sandstone Brick Wall=
Cursed Sandstone Block Wall=
Cursed Stone Carved Wall=
Forsaken Desert Cobblestone Wall=
Forsaken Desert Cobblestone Red Wall=
Forsaken Desert Brick Wall=
Forsaken Desert Brick Red Wall=
Forsaken Desert Engraved Stone Wall=
Mineral Cave Stone Wall=
Mineral Cave Cobblestone Wall=
Mineral Lava Stone with lava Wall=
Mineral Lava Stone without lava Wall=
Forsaken Desert Chiseled Stone=
+170
View File
@@ -0,0 +1,170 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--
-- Register ores
--
-- Scatter ores
-- Pyrite
Everness:register_ore({
ore_type = 'scatter',
ore = 'everness:stone_with_pyrite',
wherein = 'default:stone',
clust_scarcity = 13 * 13 * 13,
clust_num_ores = 5,
clust_size = 3,
y_max = 31000,
y_min = 1025,
})
Everness:register_ore({
ore_type = 'scatter',
ore = 'everness:stone_with_pyrite',
wherein = 'default:stone',
clust_scarcity = 15 * 15 * 15,
clust_num_ores = 3,
clust_size = 2,
y_max = -256,
y_min = -511,
})
Everness:register_ore({
ore_type = 'scatter',
ore = 'everness:stone_with_pyrite',
wherein = 'default:stone',
clust_scarcity = 13 * 13 * 13,
clust_num_ores = 5,
clust_size = 3,
y_max = -512,
y_min = -31000,
})
-- Quartz
Everness:register_ore({
ore_type = 'scatter',
ore = 'everness:quartz_ore',
wherein = { 'default:stone' },
clust_scarcity = 10 * 10 * 10,
clust_num_ores = 6,
clust_size = 5,
y_max = -5,
y_min = -31000,
})
--
-- Decorations
--
local all_biomes_mese_tree_place_on = {
'everness:coral_desert_stone_with_moss',
'everness:coral_sand',
'everness:crystal_moss_block',
'everness:crystal_sand',
'everness:cursed_dirt',
'everness:cursed_sand',
'everness:cursed_stone',
'everness:dirt_with_coral_grass',
'everness:dirt_with_crystal_grass',
'everness:dirt_with_cursed_grass',
'everness:dirt_with_grass_1',
'everness:dry_dirt',
'everness:dry_dirt_with_dry_grass',
'everness:forsaken_desert_brick',
'everness:forsaken_desert_chiseled_stone',
'everness:forsaken_desert_engraved_stone',
'everness:forsaken_desert_sand',
'everness:forsaken_tundra_beach_sand',
'everness:forsaken_tundra_dirt',
'everness:forsaken_tundra_dirt_with_grass',
'everness:frosted_ice',
'everness:frosted_ice_translucent',
'everness:frosted_snowblock',
'everness:sulfur_stone',
'everness:volcanic_sulfur'
}
if core.get_modpath('default') then
table.insert_all(all_biomes_mese_tree_place_on, {
'default:desert_sand',
'default:dirt',
'default:dirt_with_coniferous_litter',
'default:dirt_with_grass',
'default:dirt_with_rainforest_litter',
'default:dirt_with_snow',
'default:dry_dirt',
'default:dry_dirt_with_dry_grass',
'default:gravel',
'default:permafrost_with_moss',
'default:permafrost_with_stones',
'default:sand',
'default:silver_sand',
'default:stone'
})
elseif core.get_modpath('mcl_core') then
table.insert_all(all_biomes_mese_tree_place_on, {
'mcl_core:sand',
'mcl_core:dirt',
'mcl_core:podzol',
'mcl_core:dirt_with_grass',
'mcl_core:coarse_dirt',
'mcl_core:gravel',
'mcl_core:stone',
})
end
Everness:register_decoration({
name = 'everness:all_biomes_mese_tree',
deco_type = 'schematic',
place_on = all_biomes_mese_tree_place_on,
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.002,
spread = { x = 250, y = 250, z = 250 },
seed = 2,
octaves = 3,
persist = 0.66
},
y_max = 250,
y_min = 80,
schematic = core.get_modpath('everness') .. '/schematics/everness_mese_tree.mts',
flags = 'place_center_x, place_center_z',
rotation = 'random',
})
Everness:register_decoration({
name = 'everness:all_biomes_mese_tree_2',
deco_type = 'schematic',
place_on = all_biomes_mese_tree_place_on,
sidelen = 16,
noise_params = {
offset = -0.004,
scale = 0.01,
spread = { x = 100, y = 100, z = 100 },
seed = 137,
octaves = 3,
persist = 0.7,
},
y_max = 250,
y_min = 80,
schematic = core.get_modpath('everness') .. '/schematics/everness_mese_tree.mts',
flags = 'place_center_x, place_center_z',
rotation = 'random'
})
+126
View File
@@ -0,0 +1,126 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
if Everness.async_mapgen_active then
--
-- Hybrid Async Mapgen Mode (Minetest 5.9.0+ / Luanti)
--
-- The heavy VoxelManip manipulation, biome logic, and schematics are executed
-- on the dedicated background mapgen worker thread in `mapgen_async.lua`.
-- The main server thread on_generated below only executes post-generation tasks
-- that require the active ServerMap environment (node metadata, chest loot, fix_light).
--
core.register_on_generated(function(minp, maxp, blockseed)
local rand = PcgRandom(blockseed)
local biomemap = core.get_mapgen_object('biomemap') or {}
local gennotify = core.get_mapgen_object('gennotify') or {}
local shared_args = {}
local chunk_biomes = {}
for i = 1, #biomemap do
chunk_biomes[biomemap[i]] = true
end
local active_defs = {}
for _, def in ipairs(Everness.on_generated_queue) do
if def.can_run(biomemap, chunk_biomes) then
table.insert(active_defs, def)
end
end
if #active_defs == 0 then
return
end
-- Populate loot chests placed by structures in this chunk
local chest_positions = core.find_nodes_in_area(minp, maxp, { 'everness:chest' })
if #chest_positions > 0 then
Everness:populate_loot_chests(chest_positions)
end
-- Run any main-thread after_write_to_map handlers (e.g. core.fix_light, node placement)
for _, def in ipairs(active_defs) do
if 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, rand, minp, maxp)
end
end
end)
return
end
--
-- Synchronous Mapgen Mode (Fallback for Minetest <= 5.8)
--
-- Localize data buffer table outside the loop, to be re-used for all
-- mapchunks, therefore minimising memory use.
local data = {}
local p2data = {}
core.register_on_generated(function(minp, maxp, blockseed)
local rand = PcgRandom(blockseed)
local biomemap = core.get_mapgen_object('biomemap') or {}
local gennotify = core.get_mapgen_object('gennotify') or {}
local vm, emin, emax = core.get_mapgen_object('voxelmanip')
local area = VoxelArea:new({ MinEdge = emin, MaxEdge = emax })
vm:get_data(data)
vm:get_param2_data(p2data)
local shared_args = {}
local chunk_biomes = {}
for i = 1, #biomemap do
chunk_biomes[biomemap[i]] = true
end
local active_defs = {}
for _, def in ipairs(Everness.on_generated_queue) do
if def.can_run(biomemap, chunk_biomes) then
table.insert(active_defs, def)
end
end
-- on_data
for _, def in ipairs(active_defs) do
if def.on_data then
shared_args[def.name] = shared_args[def.name] or {}
def.on_data(minp, maxp, area, data, p2data, gennotify, rand, shared_args[def.name], biomemap)
end
end
vm:set_data(data)
vm:set_param2_data(p2data)
-- after_set_data
for _, def in ipairs(active_defs) do
if def.after_set_data then
shared_args[def.name] = shared_args[def.name] or {}
def.after_set_data(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args[def.name])
end
end
vm:set_lighting({ day = 0, night = 0 })
vm:calc_lighting()
vm:update_liquids()
vm:write_to_map()
-- after_write_to_map
for _, def in ipairs(active_defs) do
if 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, rand, minp, maxp)
end
end
end)
+377
View File
@@ -0,0 +1,377 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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 path = core.get_modpath('everness')
-- Shim missing main-thread engine registration/notification methods in the async mapgen environment
core.set_gen_notify = core.set_gen_notify or function() end
core.register_biome = core.register_biome or function() end
core.register_decoration = core.register_decoration or function() end
core.register_ore = core.register_ore or function() end
core.register_node = core.register_node or function() end
core.register_tool = core.register_tool or function() end
core.register_craftitem = core.register_craftitem or function() end
core.register_abm = core.register_abm or function() end
core.register_lbm = core.register_lbm or function() end
core.register_alias = core.register_alias or function() end
core.get_translator = core.get_translator or function() return function(s) return s end end
core.emerge_area = core.emerge_area or function() end
core.place_schematic = core.place_schematic or function() end
core.get_node = core.get_node or function() return { name = 'ignore' } end
core.set_node = core.set_node or function() end
core.remove_node = core.remove_node or function() end
core.get_biome_data = core.get_biome_data or function() return nil end
core.get_mapgen_setting = core.get_mapgen_setting or function() return nil end
core.dir_to_wallmounted = core.dir_to_wallmounted or function(dir)
if dir.y > 0.5 then return 1
elseif dir.y < -0.5 then return 0
elseif dir.x > 0.5 then return 5
elseif dir.x < -0.5 then return 4
elseif dir.z > 0.5 then return 3
elseif dir.z < -0.5 then return 2
end
return 0
end
core.registered_decorations = core.registered_decorations or {}
core.registered_nodes = core.registered_nodes or {}
core.registered_items = core.registered_items or {}
core.registered_biomes = core.registered_biomes or {}
core.registered_ores = core.registered_ores or {}
-- Load API definitions in the isolated mapgen Lua environment
dofile(path .. '/api.lua')
-- Load all enabled biome mapgen definitions to populate Everness.on_generated_queue
if Everness.settings.biomes.everness_bamboo_forest_under.enabled then
dofile(path .. '/mapgen_bamboo_forest_under.lua')
end
if Everness.settings.biomes.everness_bamboo_forest.enabled then
dofile(path .. '/mapgen_bamboo_forest.lua')
end
if Everness.settings.biomes.everness_baobab_savanna.enabled then
dofile(path .. '/mapgen_baobab_savanna.lua')
end
if Everness.settings.biomes.everness_coral_forest_dunes.enabled then
dofile(path .. '/mapgen_coral_forest_dunes.lua')
end
if Everness.settings.biomes.everness_coral_forest_ocean.enabled then
dofile(path .. '/mapgen_coral_forest_ocean.lua')
end
if Everness.settings.biomes.everness_coral_forest_deep_ocean.enabled then
dofile(path .. '/mapgen_coral_forest_deep_ocean.lua')
end
if Everness.settings.biomes.everness_coral_forest_under.enabled then
dofile(path .. '/mapgen_coral_forest_under.lua')
end
if Everness.settings.biomes.everness_coral_forest.enabled then
dofile(path .. '/mapgen_coral_forest.lua')
end
if Everness.settings.biomes.everness_crystal_forest_dunes.enabled then
dofile(path .. '/mapgen_crystal_forest_dunes.lua')
end
if Everness.settings.biomes.everness_crystal_forest_ocean.enabled then
dofile(path .. '/mapgen_crystal_forest_ocean.lua')
end
if Everness.settings.biomes.everness_crystal_forest_deep_ocean.enabled then
dofile(path .. '/mapgen_crystal_forest_deep_ocean.lua')
end
if Everness.settings.biomes.everness_crystal_forest_shore.enabled then
dofile(path .. '/mapgen_crystal_forest_shore.lua')
end
if Everness.settings.biomes.everness_crystal_forest_under.enabled then
dofile(path .. '/mapgen_crystal_forest_under.lua')
end
if Everness.settings.biomes.everness_crystal_forest.enabled then
dofile(path .. '/mapgen_crystal_forest.lua')
end
if Everness.settings.biomes.everness_cursed_lands_dunes.enabled then
dofile(path .. '/mapgen_cursed_lands_dunes.lua')
end
if Everness.settings.biomes.everness_cursed_lands_ocean.enabled then
dofile(path .. '/mapgen_cursed_lands_ocean.lua')
end
if Everness.settings.biomes.everness_cursed_lands_deep_ocean.enabled then
dofile(path .. '/mapgen_cursed_lands_deep_ocean.lua')
end
if Everness.settings.biomes.everness_cursed_lands_swamp.enabled then
dofile(path .. '/mapgen_cursed_lands_swamp.lua')
end
if Everness.settings.biomes.everness_cursed_lands_under.enabled then
dofile(path .. '/mapgen_cursed_lands_under.lua')
end
if Everness.settings.biomes.everness_cursed_lands.enabled then
dofile(path .. '/mapgen_cursed_lands.lua')
end
if Everness.settings.biomes.everness_forsaken_desert_ocean.enabled then
dofile(path .. '/mapgen_forsaken_desert_ocean.lua')
end
if Everness.settings.biomes.everness_forsaken_desert_under.enabled then
dofile(path .. '/mapgen_forsaken_desert_under.lua')
end
if Everness.settings.biomes.everness_forsaken_desert.enabled then
dofile(path .. '/mapgen_forsaken_desert.lua')
end
if Everness.settings.biomes.everness_forsaken_tundra_beach.enabled then
dofile(path .. '/mapgen_forsaken_tundra_beach.lua')
end
if Everness.settings.biomes.everness_forsaken_tundra_ocean.enabled then
dofile(path .. '/mapgen_forsaken_tundra_ocean.lua')
end
if Everness.settings.biomes.everness_forsaken_tundra_under.enabled then
dofile(path .. '/mapgen_forsaken_tundra_under.lua')
end
if Everness.settings.biomes.everness_forsaken_tundra.enabled then
dofile(path .. '/mapgen_forsaken_tundra.lua')
end
if Everness.settings.biomes.everness_frosted_icesheet_ocean.enabled then
dofile(path .. '/mapgen_frosted_icesheet_ocean.lua')
end
if Everness.settings.biomes.everness_frosted_icesheet_under.enabled then
dofile(path .. '/mapgen_frosted_icesheet_under.lua')
end
if Everness.settings.biomes.everness_frosted_icesheet.enabled then
dofile(path .. '/mapgen_frosted_icesheet.lua')
end
if Everness.settings.biomes.everness_mineral_waters.enabled then
dofile(path .. '/mapgen_mineral_waters.lua')
end
if Everness.settings.biomes.everness_mineral_waters_under.enabled then
dofile(path .. '/mapgen_mineral_waters_under.lua')
end
-- Reusable data buffers for VoxelManip in the async worker thread
local data = {}
local p2data = {}
-- Persistent content ID and group caches for async mapgen lookups
local cid_cache = {}
local group_cids_cache = {}
local function safe_get_content_id(name)
local id = cid_cache[name]
if id ~= nil then
if id then
return id
end
return nil
end
local ok, res = pcall(core.get_content_id, name)
if ok and type(res) == 'number' then
cid_cache[name] = res
return res
end
cid_cache[name] = false
return nil
end
local function get_group_cids(group_name)
local list = group_cids_cache[group_name]
if list then
return list
end
list = {}
for node_name in pairs(core.registered_nodes) do
if core.get_item_group(node_name, group_name) > 0 then
local id = safe_get_content_id(node_name)
if id and (not core.CONTENT_IGNORE or id ~= core.CONTENT_IGNORE) then
list[#list + 1] = id
end
end
end
group_cids_cache[group_name] = list
return list
end
local function build_cids_map(nodenames)
local cids_map = {}
for _, name in ipairs(nodenames) do
if name:sub(1, 6) == 'group:' then
local g = name:sub(7)
local cids = get_group_cids(g)
for i = 1, #cids do
cids_map[cids[i]] = name
end
else
local id = safe_get_content_id(name)
if id then
cids_map[id] = name
end
end
end
return cids_map
end
-- Async on_generated callback in Minetest 5.9.0+ / Luanti
-- Receives `vmanip` as the first argument; engine commits vmanip automatically on return
core.register_on_generated(function(vmanip, minp, maxp, blockseed)
local rand = PcgRandom(blockseed)
local biomemap = core.get_mapgen_object('biomemap') or {}
local gennotify = core.get_mapgen_object('gennotify') or {}
local emin, emax = vmanip:get_emerged_area()
local area = VoxelArea:new({ MinEdge = emin, MaxEdge = emax })
-- Fetch raw voxel data upfront for direct, high-performance array indexing
vmanip:get_data(data)
vmanip:get_param2_data(p2data)
local c_air = core.get_content_id('air')
local ystride = area.ystride
-- Expose VoxelManip-backed helper functions for structure / marker checks during mapgen
core.get_node = function(pos)
return vmanip:get_node_at(pos)
end
core.set_node = function(pos, node)
return vmanip:set_node_at(pos, node)
end
core.remove_node = function(pos)
return vmanip:set_node_at(pos, { name = 'air' })
end
core.swap_node = function(pos, node)
return vmanip:set_node_at(pos, node)
end
core.find_nodes_in_area = function(search_minp, search_maxp, nodenames, grouped)
if type(nodenames) == 'string' then
nodenames = { nodenames }
end
local cids_map = build_cids_map(nodenames)
if grouped then
local res = {}
local counts = {}
for _, name in ipairs(nodenames) do
res[name] = {}
counts[name] = 0
end
for z = search_minp.z, search_maxp.z do
for y = search_minp.y, search_maxp.y do
local vi = area:index(search_minp.x, y, z)
for x = search_minp.x, search_maxp.x do
local cid = data[vi]
local match_name = cids_map[cid]
if match_name then
local tbl = res[match_name]
tbl[#tbl + 1] = vector.new(x, y, z)
counts[match_name] = counts[match_name] + 1
end
vi = vi + 1
end
end
end
return res, counts
else
local res = {}
local counts = {}
for z = search_minp.z, search_maxp.z do
for y = search_minp.y, search_maxp.y do
local vi = area:index(search_minp.x, y, z)
for x = search_minp.x, search_maxp.x do
local cid = data[vi]
local match_name = cids_map[cid]
if match_name then
res[#res + 1] = vector.new(x, y, z)
counts[match_name] = (counts[match_name] or 0) + 1
end
vi = vi + 1
end
end
end
return res, counts
end
end
core.emerge_area = function(search_minp, search_maxp, callback, extra_data)
if extra_data and extra_data.callback then
extra_data.callback(extra_data.data)
elseif callback then
callback(nil, 0, 0, extra_data)
end
end
core.place_schematic = function(pos, schem, rot, repl, force, flags)
return core.place_schematic_on_vmanip(vmanip, pos, schem, rot, repl, force, flags)
end
core.find_nodes_in_area_under_air = function(search_minp, search_maxp, nodenames)
if type(nodenames) == 'string' then
nodenames = { nodenames }
end
local cids_map = build_cids_map(nodenames)
local res = {}
for z = search_minp.z, search_maxp.z do
for y = search_minp.y, search_maxp.y do
local vi = area:index(search_minp.x, y, z)
for x = search_minp.x, search_maxp.x do
local cid = data[vi]
if cids_map[cid] then
local vi_above = vi + ystride
if data[vi_above] == c_air then
res[#res + 1] = vector.new(x, y, z)
end
end
vi = vi + 1
end
end
end
return res
end
local chunk_biomes = {}
for i = 1, #biomemap do
chunk_biomes[biomemap[i]] = true
end
local active_defs = {}
for _, def in ipairs(Everness.on_generated_queue) do
if def.can_run(biomemap, chunk_biomes) then
table.insert(active_defs, def)
end
end
if #active_defs == 0 then
return
end
local shared_args = {}
-- 1. on_data: Raw VoxelManip content/param2 manipulation
for _, def in ipairs(active_defs) do
if def.on_data then
shared_args[def.name] = shared_args[def.name] or {}
def.on_data(minp, maxp, area, data, p2data, gennotify, rand, shared_args[def.name], biomemap)
end
end
vmanip:set_data(data)
vmanip:set_param2_data(p2data)
-- 2. after_set_data: Schematics placement on VoxelManip
for _, def in ipairs(active_defs) do
if def.after_set_data then
shared_args[def.name] = shared_args[def.name] or {}
def.after_set_data(minp, maxp, vmanip, area, data, p2data, gennotify, rand, shared_args[def.name])
end
end
-- 3. Lighting & Liquid calculation
vmanip:set_lighting({ day = 0, night = 0 })
vmanip:calc_lighting()
vmanip:update_liquids()
-- Note: vmanip:write_to_map() is NOT called here because the engine automatically
-- writes and commits the async vmanip upon callback completion.
end)
+538
View File
@@ -0,0 +1,538 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--
-- Register biomes
--
local y_max = Everness.settings.biomes.everness_bamboo_forest.y_max
local y_min = Everness.settings.biomes.everness_bamboo_forest.y_min
-- Bamboo Forest
Everness:register_biome({
name = 'everness:bamboo_forest',
node_top = 'everness:dirt_with_grass_1',
depth_top = 1,
node_filler = 'everness:dirt_1',
depth_filler = 1,
node_riverbed = 'default:sand',
depth_riverbed = 2,
node_dungeon = 'everness:bamboo_wood',
node_dungeon_alt = 'everness:bamboo_mosaic_wood',
node_dungeon_stair = 'stairs:stair_bamboo_wood',
y_max = y_max,
y_min = y_min,
heat_point = 80,
humidity_point = 60,
})
--
-- Register decorations
--
Everness:register_decoration({
name = 'everness:bamboo_forest_small_bamboo',
deco_type = 'schematic',
place_on = { 'everness:dirt_with_grass_1' },
sidelen = 80,
fill_ratio = 0.1,
biomes = { 'everness:bamboo_forest' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_small_bamboo.mts',
flags = 'place_center_x, place_center_z, force_placement',
rotation = 'random',
})
Everness:register_decoration({
name = 'everness:bamboo_forest_large_bamboo',
deco_type = 'schematic',
place_on = { 'everness:dirt_with_grass_1' },
sidelen = 80,
fill_ratio = 0.1,
biomes = { 'everness:bamboo_forest' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_large_bamboo.mts',
flags = 'place_center_x, place_center_z, force_placement',
rotation = 'random',
})
-- Jungle tree and log
local jungle_tree_schem
local jungle_log_schem
if core.get_modpath('default') then
jungle_tree_schem = core.get_modpath('default') .. '/schematics/jungle_tree.mts'
jungle_log_schem = core.get_modpath('default') .. '/schematics/jungle_log.mts'
elseif core.get_modpath('mcl_core') then
jungle_tree_schem = core.get_modpath('mcl_core') .. '/schematics/mcl_core_jungle_tree.mts'
jungle_log_schem = {
size = { x = 3, y = 3, z = 1 },
data = {
{ name = 'air', prob = 0 },
{ name = 'air', prob = 0 },
{ name = 'air', prob = 0 },
{ name = 'mcl_core:jungletree', param2 = 12 },
{ name = 'mcl_core:jungletree', param2 = 12 },
{ name = 'mcl_core:jungletree', param2 = 12, prob = 127 },
{ name = 'air', prob = 0 },
{ name = 'mcl_mushrooms:mushroom_brown', prob = 50 },
{ name = 'air', prob = 0 },
},
}
end
if jungle_tree_schem then
Everness:register_decoration({
name = 'everness:bamboo_forest_jungle_tree',
deco_type = 'schematic',
place_on = { 'everness:dirt_with_grass_1' },
sidelen = 16,
noise_params = {
offset = 0.0015,
scale = 0.0021,
spread = { x = 250, y = 250, z = 250 },
seed = 2,
octaves = 3,
persist = 0.66
},
biomes = { 'everness:bamboo_forest' },
y_max = y_max,
y_min = y_min,
schematic = jungle_tree_schem,
flags = 'place_center_x, place_center_z',
rotation = 'random',
})
end
if jungle_log_schem then
Everness:register_decoration({
name = 'everness:bamboo_forest_jungle_log',
deco_type = 'schematic',
place_on = { 'everness:dirt_with_grass_1' },
place_offset_y = 1,
sidelen = 16,
noise_params = {
offset = 0.0015,
scale = 0.0021,
spread = { x = 250, y = 250, z = 250 },
seed = 2,
octaves = 3,
persist = 0.66
},
biomes = { 'everness:bamboo_forest' },
y_max = y_max,
y_min = y_min,
schematic = jungle_log_schem,
flags = 'place_center_x',
rotation = 'random',
spawn_by = 'everness:dirt_with_grass_1',
num_spawn_by = 8,
})
end
-- Bush
local bush_schem
local blueberry_bush_schem
if core.get_modpath('default') then
bush_schem = core.get_modpath('default') .. '/schematics/bush.mts'
blueberry_bush_schem = core.get_modpath('default') .. '/schematics/blueberry_bush.mts'
elseif core.get_modpath('mcl_core') then
local everness_path = core.get_modpath('everness')
bush_schem = everness_path .. '/mod_support_mcl/schematics/bush.mts'
blueberry_bush_schem = everness_path .. '/mod_support_mcl/schematics/blueberry_bush.mts'
end
if bush_schem then
Everness:register_decoration({
name = 'everness:bamboo_forest_bush',
deco_type = 'schematic',
place_on = { 'everness:dirt_with_grass_1' },
sidelen = 16,
noise_params = {
offset = -0.004,
scale = 0.01,
spread = { x = 100, y = 100, z = 100 },
seed = 137,
octaves = 3,
persist = 0.7,
},
biomes = { 'everness:bamboo_forest' },
y_max = y_max,
y_min = y_min,
schematic = bush_schem,
flags = 'place_center_x, place_center_z',
})
end
if blueberry_bush_schem then
Everness:register_decoration({
name = 'everness:bamboo_forest_blueberry_bush',
deco_type = 'schematic',
place_on = { 'everness:dirt_with_grass_1' },
sidelen = 16,
noise_params = {
offset = -0.004,
scale = 0.01,
spread = { x = 100, y = 100, z = 100 },
seed = 697,
octaves = 3,
persist = 0.7,
},
biomes = { 'everness:bamboo_forest' },
y_max = y_max,
y_min = y_min,
place_offset_y = 1,
schematic = blueberry_bush_schem,
flags = 'place_center_x, place_center_z',
})
end
-- Flowers
local function register_flower_decoration(offset, scale, length)
Everness:register_decoration({
name = 'everness:bamboo_forest_flowers_' .. length,
deco_type = 'simple',
place_on = { 'everness:dirt_with_grass_1' },
param2 = 0,
param2_max = 3,
sidelen = 16,
noise_params = {
offset = offset,
scale = scale,
spread = { x = 200, y = 200, z = 200 },
seed = 329,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:bamboo_forest' },
y_max = y_max,
y_min = y_min,
decoration = 'everness:flowers_' .. length,
})
end
register_flower_decoration(-0.03, 0.09, 4)
register_flower_decoration(-0.015, 0.075, 3)
register_flower_decoration(0, 0.06, 2)
register_flower_decoration(0.015, 0.045, 1)
local function register_flower_magenta_decoration(offset, scale, length)
Everness:register_decoration({
name = 'everness:bamboo_forest_flowers_magenta_' .. length,
deco_type = 'simple',
place_on = { 'everness:dirt_with_grass_1' },
param2 = 0,
param2_max = 3,
sidelen = 16,
noise_params = {
offset = offset,
scale = scale,
spread = { x = 200, y = 200, z = 200 },
seed = 329,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:bamboo_forest' },
y_max = y_max,
y_min = y_min,
decoration = 'everness:flowers_magenta_' .. length,
})
end
register_flower_magenta_decoration(-0.03, 0.09, 4)
register_flower_magenta_decoration(-0.015, 0.075, 3)
register_flower_magenta_decoration(0, 0.06, 2)
register_flower_magenta_decoration(0.015, 0.045, 1)
-- Clovers
local function register_clover_decoration(offset, scale, length)
Everness:register_decoration({
name = 'everness:bamboo_forest_clover_' .. length,
deco_type = 'simple',
place_on = { 'everness:dirt_with_grass_1' },
param2 = 0,
param2_max = 3,
sidelen = 16,
noise_params = {
offset = offset,
scale = scale,
spread = { x = 200, y = 200, z = 200 },
seed = 329,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:bamboo_forest' },
y_max = y_max,
y_min = y_min,
decoration = 'everness:clover_' .. length,
})
end
register_clover_decoration(-0.03, -0.09, 4)
register_clover_decoration(-0.015, -0.075, 3)
register_clover_decoration(0, -0.06, 2)
register_clover_decoration(0.015, -0.045, 1)
-- Clovers with flowers
local function register_clover_with_flowers_decoration(offset, scale, length)
Everness:register_decoration({
name = 'everness:bamboo_forest_clover_with_flowers_' .. length,
deco_type = 'simple',
place_on = { 'everness:dirt_with_grass_1' },
param2 = 0,
param2_max = 3,
sidelen = 16,
noise_params = {
offset = offset,
scale = scale,
spread = { x = 200, y = 200, z = 200 },
seed = 329,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:bamboo_forest' },
y_max = y_max,
y_min = y_min,
decoration = 'everness:clover_with_flovers_' .. length,
})
end
register_clover_with_flowers_decoration(-0.03, -0.09, 4)
register_clover_with_flowers_decoration(-0.015, -0.075, 3)
register_clover_with_flowers_decoration(0, -0.06, 2)
register_clover_with_flowers_decoration(0.015, -0.045, 1)
--
-- On Generated
--
local disp = 16
local chance = 20
local schem = core.get_modpath('everness') .. '/schematics/everness_japanese_shrine.mts'
local c_everness_bamboo_1 = core.get_content_id('everness:bamboo_1')
local c_everness_bamboo_2 = core.get_content_id('everness:bamboo_2')
local c_everness_bamboo_3 = core.get_content_id('everness:bamboo_3')
local c_everness_bamboo_4 = core.get_content_id('everness:bamboo_4')
local c_everness_bamboo_5 = core.get_content_id('everness:bamboo_5')
local c_dirt_with_grass_1 = core.get_content_id('everness:dirt_with_grass_1')
local c_dirt_with_grass_extras_1 = core.get_content_id('everness:dirt_with_grass_extras_1')
local c_dirt_with_grass_extras_2 = core.get_content_id('everness:dirt_with_grass_extras_2')
local biome_id_bamboo_forest = core.get_biome_id('everness:bamboo_forest')
local d_everness_bamboo_forest_small_bamboo = core.get_decoration_id('everness:bamboo_forest_small_bamboo')
local d_everness_bamboo_forest_large_bamboo = core.get_decoration_id('everness:bamboo_forest_large_bamboo')
Everness:register_gen_notify_decoration({
d_everness_bamboo_forest_small_bamboo,
d_everness_bamboo_forest_large_bamboo,
})
Everness:add_to_queue_on_generated({
name = 'everness:bamboo_forest',
can_run = function(biomemap, chunk_biomes)
return (chunk_biomes and chunk_biomes[biome_id_bamboo_forest]) or table.indexof(biomemap, biome_id_bamboo_forest) ~= -1
end,
on_data = function(minp, maxp, area, data, p2data, gennotify, rand, shared_args)
--
-- Small Bamboo
--
for _, pos in ipairs(gennotify['decoration#' .. (d_everness_bamboo_forest_small_bamboo or '')] or {}) do
local vi = area:indexp(pos)
local stalk_color = rand:next(0, 7) * 32
local stalk_p2 = stalk_color + (p2data[vi + area.ystride] % 32)
for i = 1, 3 do
local cur_vi = vi + area.ystride * i
if data[cur_vi] == c_everness_bamboo_1 or data[cur_vi] == c_everness_bamboo_2 then
p2data[cur_vi] = stalk_p2
end
end
end
--
-- Large Bamboo
--
for _, pos in ipairs(gennotify['decoration#' .. (d_everness_bamboo_forest_large_bamboo or '')] or {}) do
-- For bamboo large this is position of the 'place_on' node, e.g. 'everness:dirt_with_grass_extras_2'
local vi = area:indexp(pos)
local while_counter = 1
local bamboo_height = 0
local last_vi = vi + area.ystride * while_counter
local stalk_color = rand:next(0, 7) * 32
local stalk_p2 = stalk_color + (p2data[vi + area.ystride] % 32)
-- Get bamboo height and color each bamboo node
while data[last_vi] == c_everness_bamboo_3 do
p2data[last_vi] = stalk_p2
bamboo_height = bamboo_height + 1
while_counter = while_counter + 1
last_vi = vi + area.ystride * while_counter
end
-- Position of the top bamboo_3 node
last_vi = vi + area.ystride * bamboo_height
-- Add top bamboo nodes with leaves based on their generated height
if bamboo_height > 4 then
for i = 1, 3 do
if data[last_vi + area.ystride * i] == core.CONTENT_AIR then
if i == 1 then
data[last_vi + area.ystride * i] = c_everness_bamboo_4
else
data[last_vi + area.ystride * i] = c_everness_bamboo_5
end
p2data[last_vi + area.ystride * i] = stalk_p2
end
end
else
for i = 1, 2 do
if data[last_vi + area.ystride * i] == core.CONTENT_AIR then
if i == 1 then
data[last_vi + area.ystride * i] = c_everness_bamboo_4
else
data[last_vi + area.ystride * i] = c_everness_bamboo_5
end
p2data[last_vi + area.ystride * i] = stalk_p2
end
end
end
end
end,
after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args)
local sidelength = maxp.x - minp.x + 1
local x_disp = rand:next(0, disp)
local z_disp = rand:next(0, disp)
shared_args.schem_positions = {}
for y = minp.y, maxp.y do
local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp)
if
(
data[vi + area.ystride] == core.CONTENT_AIR
or data[vi + area.ystride] == c_everness_bamboo_1
or data[vi + area.ystride] == c_everness_bamboo_3
)
and (
data[vi] == c_dirt_with_grass_1
or data[vi] == c_dirt_with_grass_extras_1
or data[vi] == c_dirt_with_grass_extras_2
)
and rand:next(0, 100) < chance
then
local s_pos = area:position(vi)
--
-- Japanese Shrine
--
local size = { x = 11, y = 19, z = 15 }
local size_x = math.round(size.x / 2)
local size_z = math.round(size.z / 2)
local schem_pos = vector.new(s_pos)
-- find floor big enough
local positions = core.find_nodes_in_area_under_air(
vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z),
{
'everness:dirt_with_grass_1'
}
)
-- Can force over these blocks
local force_positions = core.find_nodes_in_area(
vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z),
{
'everness:dirt_with_grass_extras_1',
'everness:dirt_with_grass_extras_2',
'group:bamboo',
'group:flower',
'group:leaves'
}
)
if #positions + #force_positions < size.x * size.z then
-- not enough space
return
end
-- enough air to place structure ?
local air_positions = core.find_nodes_in_area(
vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z),
{
'air',
'group:bamboo',
'group:flower',
'group:leaves'
}
)
if #air_positions > (size.x * size.y * size.z) / 2 then
core.place_schematic_on_vmanip(
vm,
schem_pos,
schem,
'random',
nil,
true,
'place_center_x, place_center_z'
)
shared_args.schem_positions.everness_japanese_shrine = shared_args.schem_positions.everness_japanese_shrine or {}
table.insert(shared_args.schem_positions.everness_japanese_shrine, {
pos = schem_pos,
minp = vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z),
maxp = vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z)
})
core.log('action', '[Everness] Japanese Shrine was placed at ' .. schem_pos:to_string())
end
end
end
end,
after_write_to_map = function(shared_args)
local schem_positions = shared_args.schem_positions or {}
for name, tbl in pairs(schem_positions) do
if next(tbl) then
for i, v in ipairs(tbl) do
local chest_positions = core.find_nodes_in_area(
v.minp,
v.maxp,
{ 'everness:chest' }
)
if #chest_positions > 0 then
Everness:populate_loot_chests(chest_positions)
end
end
end
end
end
})
@@ -0,0 +1,239 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--
-- Register biomes
--
local y_max = Everness.settings.biomes.everness_bamboo_forest_under.y_max
local y_min = Everness.settings.biomes.everness_bamboo_forest_under.y_min
-- Bamboo Forest Under
Everness:register_biome({
name = 'everness:bamboo_forest_under',
node_cave_liquid = { 'mapgen_water_source', 'mapgen_lava_source' },
node_dungeon = 'everness:bamboo_wood',
node_dungeon_alt = 'everness:bamboo_mosaic_wood',
node_dungeon_stair = 'stairs:stair_bamboo_wood',
y_max = y_max,
y_min = y_min,
heat_point = 80,
humidity_point = 60,
})
--
-- Register decorations
--
Everness:register_decoration({
name = 'everness:bamboo_forest_under_floors',
deco_type = 'simple',
place_on = { 'default:stone' },
sidelen = 16,
fill_ratio = 10,
biomes = { 'everness:bamboo_forest_under' },
y_max = y_max,
y_min = y_min,
place_offset_y = -1,
flags = 'all_floors,force_placement',
decoration = {
'everness:moss_block',
'default:clay'
},
})
Everness:register_decoration({
name = 'everness:bamboo_forest_under_ceiling',
deco_type = 'simple',
place_on = { 'default:stone' },
sidelen = 16,
fill_ratio = 0.4,
biomes = { 'everness:bamboo_forest_under' },
y_max = y_max,
y_min = y_min,
flags = 'all_ceilings',
decoration = { 'everness:moss_block' },
})
Everness:register_decoration({
name = 'everness:bamboo_forest_under_forsythia_bush',
deco_type = 'simple',
place_on = { 'everness:moss_block' },
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.002,
spread = { x = 250, y = 250, z = 250 },
seed = 2,
octaves = 3,
persist = 0.66
},
biomes = { 'everness:bamboo_forest_under' },
y_max = y_max - 500 > y_min and y_max - 500 or y_max,
y_min = y_min,
flags = 'all_floors',
decoration = { 'everness:forsythia_bush' },
})
Everness:register_decoration({
name = 'everness:bamboo_forest_under_vines',
deco_type = 'simple',
place_on = { 'everness:moss_block' },
sidelen = 16,
fill_ratio = 0.09,
decoration = {
'everness:vine_cave',
'everness:vine_cave_with_mese_leaves'
},
biomes = { 'everness:bamboo_forest_under' },
y_max = y_max,
y_min = y_min,
flags = 'all_ceilings',
spawn_by = 'air',
num_spawn_by = 8
})
Everness:register_decoration({
name = 'everness:bamboo_forest_under_plants',
deco_type = 'simple',
place_on = { 'everness:moss_block' },
param2 = 8,
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.02,
spread = { x = 200, y = 200, z = 200 },
seed = 329,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:bamboo_forest_under' },
y_max = y_max,
y_min = y_min,
decoration = { 'everness:cave_flower' },
flags = 'all_floors'
})
Everness:register_decoration({
name = 'everness:bamboo_forest_under_plants_2',
deco_type = 'simple',
place_on = { 'everness:moss_block' },
param2 = 8,
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.02,
spread = { x = 200, y = 200, z = 200 },
seed = 329,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:bamboo_forest_under' },
y_max = y_max - 1000 > y_min and y_max - 1000 or y_max,
y_min = y_min,
decoration = { 'everness:cave_flower_with_particles' },
flags = 'all_floors'
})
Everness:register_decoration({
name = 'everness:bamboo_forest_under_blue_vine_lantern',
deco_type = 'simple',
place_on = {
'everness:moss_block',
'default:clay'
},
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.002,
spread = { x = 250, y = 250, z = 250 },
seed = 2,
octaves = 3,
persist = 0.66
},
biomes = { 'everness:bamboo_forest_under' },
y_max = y_max - 1500 > y_min and y_max - 1500 or y_max,
y_min = y_min,
decoration = { 'everness:blue_vine_lantern' },
flags = 'all_floors',
})
-- Luminous Mushrooms
local function register_luminous_mushroom_decoration(offset, scale, length)
Everness:register_decoration({
name = 'everness:bamboo_forest_under_luminous_mushroom_' .. length,
deco_type = 'simple',
place_on = {
'everness:moss_block',
'default:clay'
},
param2 = 0,
param2_max = 3,
sidelen = 16,
noise_params = {
offset = offset,
scale = scale,
spread = { x = 200, y = 200, z = 200 },
seed = 329,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:bamboo_forest_under' },
y_max = y_max - 1500 > y_min and y_max - 1500 or y_max,
y_min = y_min,
decoration = 'everness:luminous_mushroom_' .. length,
flags = 'all_floors'
})
end
register_luminous_mushroom_decoration(-0.03, 0.09, 4)
register_luminous_mushroom_decoration(-0.015, 0.075, 3)
register_luminous_mushroom_decoration(0, 0.06, 2)
register_luminous_mushroom_decoration(0.015, 0.045, 1)
-- Glossy Mushrooms
local function register_glossy_mushroom_decoration(offset, scale, length)
Everness:register_decoration({
name = 'everness:bamboo_forest_under_glossy_mushroom_' .. length,
deco_type = 'simple',
place_on = {
'everness:moss_block',
'default:clay'
},
param2 = 0,
param2_max = 3,
sidelen = 16,
noise_params = {
offset = offset,
scale = scale,
spread = { x = 200, y = 200, z = 200 },
seed = 329,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:bamboo_forest_under' },
y_max = y_max,
y_min = y_min,
decoration = 'everness:glossy_mushroom_' .. length,
flags = 'all_floors'
})
end
register_glossy_mushroom_decoration(-0.03, -0.09, 4)
register_glossy_mushroom_decoration(-0.015, -0.075, 3)
register_glossy_mushroom_decoration(0, -0.06, 2)
register_glossy_mushroom_decoration(0.015, -0.045, 1)
+279
View File
@@ -0,0 +1,279 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--
-- Register biomes
--
local y_max = Everness.settings.biomes.everness_baobab_savanna.y_max
local y_min = Everness.settings.biomes.everness_baobab_savanna.y_min
-- Baobab Savanna
Everness:register_biome({
name = 'everness:baobab_savanna',
node_top = 'everness:dry_dirt_with_dry_grass',
depth_top = 1,
node_filler = 'everness:dry_dirt',
depth_filler = 1,
node_riverbed = 'default:sand',
depth_riverbed = 2,
node_dungeon = 'default:cobble',
node_dungeon_alt = 'default:mossycobble',
node_dungeon_stair = 'stairs:stair_cobble',
y_max = y_max,
y_min = y_min,
heat_point = 80,
humidity_point = 30,
})
--
-- Register decorations
--
-- Savanna bare dirt patches.
-- Must come before all savanna decorations that are placed on dry grass.
-- Noise is similar to long dry grass noise, but scale inverted, to appear
-- where long dry grass is least dense and shortest.
Everness:register_decoration({
name = 'everness:baobab_savanna_dry_dirt_with_dry_grass',
deco_type = 'simple',
place_on = { 'everness:dry_dirt_with_dry_grass' },
sidelen = 4,
noise_params = {
offset = -1.5,
scale = -1.5,
spread = { x = 200, y = 200, z = 200 },
seed = 329,
octaves = 4,
persist = 1.0
},
biomes = { 'everness:baobab_savanna' },
y_max = y_max,
y_min = y_min,
decoration = 'everness:dry_dirt',
place_offset_y = -1,
flags = 'force_placement',
})
Everness:register_decoration({
name = 'everness:baobab_savanna_baobab_tree_1',
deco_type = 'schematic',
place_on = { 'everness:dry_dirt_with_dry_grass', 'everness:dry_dirt' },
spawn_by = { 'everness:dry_dirt_with_dry_grass', 'everness:dry_dirt' },
num_spawn_by = 8,
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.002,
spread = { x = 250, y = 250, z = 250 },
seed = 2,
octaves = 3,
persist = 0.66
},
biomes = { 'everness:baobab_savanna' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_baobab_tree.mts',
flags = 'place_center_x, place_center_z',
rotation = 'random',
})
Everness:register_decoration({
name = 'everness:baobab_savanna_baobab_tree_2',
deco_type = 'schematic',
place_on = { 'everness:dry_dirt_with_dry_grass', 'everness:dry_dirt' },
spawn_by = { 'everness:dry_dirt_with_dry_grass', 'everness:dry_dirt' },
num_spawn_by = 8,
sidelen = 16,
noise_params = {
offset = -0.004,
scale = 0.01,
spread = { x = 100, y = 100, z = 100 },
seed = 90155,
octaves = 3,
persist = 0.7,
},
biomes = { 'everness:baobab_savanna' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_baobab_tree.mts',
flags = 'place_center_x, place_center_z',
rotation = 'random',
})
Everness:register_decoration({
name = 'everness:baobab_savanna_baobab_log',
deco_type = 'schematic',
place_on = { 'everness:dry_dirt_with_dry_grass' },
sidelen = 16,
place_offset_y = 1,
noise_params = {
offset = 0,
scale = 0.001,
spread = { x = 250, y = 250, z = 250 },
seed = 2,
octaves = 3,
persist = 0.66
},
biomes = { 'everness:baobab_savanna' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_baobab_log.mts',
flags = 'place_center_x',
rotation = 'random',
spawn_by = 'everness:dry_dirt_with_dry_grass',
num_spawn_by = 8,
})
-- Dry grasses
local function register_dry_grass_decoration(offset, scale, length)
Everness:register_decoration({
name = 'everness:dry_grass_' .. length,
deco_type = 'simple',
place_on = { 'everness:dry_dirt_with_dry_grass' },
sidelen = 16,
noise_params = {
offset = offset,
scale = scale,
spread = { x = 200, y = 200, z = 200 },
seed = 329,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:baobab_savanna' },
y_max = y_max,
y_min = y_min,
decoration = 'everness:dry_grass_' .. length,
param2 = 0,
param2_max = 239,
})
end
register_dry_grass_decoration(0.01, 0.05, 4)
register_dry_grass_decoration(0.03, 0.03, 3)
register_dry_grass_decoration(0.05, 0.01, 2)
register_dry_grass_decoration(0.07, -0.01, 1)
--
-- On Generated
--
local disp = 16
local chance = 100
local schem = core.get_modpath('everness') .. '/schematics/everness_giant_sequoia_tree.mts'
local size = { x = 25, y = 75, z = 25 }
local size_x = math.round(size.x / 2)
local size_z = math.round(size.z / 2)
local baobab_tree_size = { x = 24, y = 39, z = 24 }
local baobab_tree_size_x = math.round(baobab_tree_size.x / 2)
local baobab_tree_size_z = math.round(baobab_tree_size.z / 2)
local biome_id_baobab_savanna = core.get_biome_id('everness:baobab_savanna')
local deco_ids_baobab = {
core.get_decoration_id('everness:baobab_savanna_baobab_tree_1'),
core.get_decoration_id('everness:baobab_savanna_baobab_tree_2')
}
if #deco_ids_baobab > 1 then
Everness:register_gen_notify_decoration(deco_ids_baobab)
end
Everness:add_to_queue_on_generated({
name = 'everness:baobab_savanna',
can_run = function(biomemap, chunk_biomes)
return (chunk_biomes and chunk_biomes[biome_id_baobab_savanna]) or table.indexof(biomemap, biome_id_baobab_savanna) ~= -1
end,
after_write_to_map = function(shared_args, gennotify, rand, minp, maxp)
--
-- Baobab Tree - fix light
--
for _, deco_id in ipairs(deco_ids_baobab) do
for _, pos in ipairs(gennotify['decoration#' .. (deco_id or '')] or {}) do
core.fix_light(
vector.new(pos.x - baobab_tree_size_x, pos.y - 1, pos.z - baobab_tree_size_z),
vector.new(pos.x + baobab_tree_size_x, pos.y + baobab_tree_size.y, pos.z + baobab_tree_size_z)
)
end
end
--
-- Giant Sequoia (placed on main thread via emerge_area to prevent chunk boundary cut-offs)
--
if minp and maxp and rand and rand:next(0, 100) < chance then
local sidelength = maxp.x - minp.x + 1
local x_disp = rand:next(0, disp)
local z_disp = rand:next(0, disp)
local target_x = minp.x + math.floor(sidelength / 2) + x_disp
local target_z = minp.z + math.floor(sidelength / 2) + z_disp
local ground_nodes = core.find_nodes_in_area_under_air(
vector.new(target_x, minp.y, target_z),
vector.new(target_x, maxp.y, target_z),
{
'everness:dry_dirt_with_dry_grass',
'everness:dry_dirt'
}
)
if #ground_nodes > 0 then
local s_pos = ground_nodes[1]
core.emerge_area(
vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z),
function(blockpos, action, calls_remaining, param)
Everness:emerge_area(blockpos, action, calls_remaining, param)
end,
{
callback = function()
local positions = core.find_nodes_in_area_under_air(
vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z),
{
'everness:dry_dirt_with_dry_grass',
'everness:dry_dirt',
'group:flora',
'group:flower'
}
)
if #positions < size.x * size.z then
-- not enough space
return
end
core.place_schematic(
s_pos,
schem,
'random',
nil,
true,
'place_center_x, place_center_z'
)
core.log('action', '[Everness] Giant Sequoia was placed at ' .. s_pos:to_string())
end
}
)
end
end
end
})
+312
View File
@@ -0,0 +1,312 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--
-- Register biomes
--
local y_max = Everness.settings.biomes.everness_coral_forest.y_max
local y_min = Everness.settings.biomes.everness_coral_forest.y_min
-- Coral Forest
Everness:register_biome({
name = 'everness:coral_forest',
node_top = 'everness:dirt_with_coral_grass',
depth_top = 1,
node_filler = 'everness:coral_dirt',
depth_filler = 1,
node_riverbed = 'everness:coral_dirt',
depth_riverbed = 2,
node_stone = 'everness:coral_desert_stone',
node_dungeon = 'everness:coral_desert_stone_block',
node_dungeon_alt = 'everness:coral_desert_stone_brick',
node_dungeon_stair = 'stairs:stair_coral_desert_stone_block',
y_max = y_max,
y_min = y_min,
heat_point = 60,
humidity_point = 50,
})
--
-- Register ores
--
-- Blob ore.
-- These before scatter ores to avoid other ores in blobs.
-- Coral sand
Everness:register_ore({
ore_type = 'blob',
ore = 'everness:coral_sand',
wherein = { 'everness:coral_desert_stone' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = 2316,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:coral_forest' }
})
-- Dirt
Everness:register_ore({
ore_type = 'blob',
ore = 'everness:coral_dirt',
wherein = { 'everness:coral_desert_stone' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = 17676,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:coral_forest' }
})
-- Scatter ores
-- Coal
Everness:register_ore({
ore_type = 'scatter',
ore = 'everness:coral_desert_stone_with_coal',
wherein = 'everness:coral_desert_stone',
clust_scarcity = 8 * 8 * 8,
clust_num_ores = 9,
clust_size = 3,
y_max = y_max,
y_min = y_min,
biomes = { 'everness:coral_forest' }
})
--
-- Register decorations
--
-- Coral Forest
local chunksize = tonumber(core.get_mapgen_setting('chunksize')) or 5
if chunksize >= 5 then
Everness:register_decoration({
name = 'everness:coral_forest_coral_tree',
deco_type = 'schematic',
place_on = { 'everness:dirt_with_coral_grass' },
place_offset_y = 0,
sidelen = 16,
noise_params = {
offset = 0.0015,
scale = 0.0021,
spread = { x = 250, y = 250, z = 250 },
seed = 2,
octaves = 3,
persist = 0.66
},
biomes = { 'everness:coral_forest' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_coral_tree.mts',
flags = 'place_center_x, place_center_z',
rotation = 'random',
spawn_by = 'everness:dirt_with_coral_grass',
num_spawn_by = 8,
})
end
Everness:register_decoration({
name = 'everness:coral_forest_coral_bones_tree',
deco_type = 'schematic',
place_on = { 'everness:dirt_with_coral_grass' },
sidelen = 16,
place_offset_y = -1,
noise_params = {
offset = -0.004,
scale = 0.01,
spread = { x = 100, y = 100, z = 100 },
seed = 137,
octaves = 3,
persist = 0.7,
},
biomes = { 'everness:coral_forest' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_coral_bones_tree.mts',
flags = 'place_center_x, place_center_z',
rotation = 'random',
})
Everness:register_decoration({
name = 'everness:coral_forest_coral_burdock',
deco_type = 'simple',
place_on = { 'everness:dirt_with_coral_grass' },
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.006,
spread = { x = 250, y = 250, z = 250 },
seed = 2,
octaves = 3,
persist = 0.66
},
biomes = { 'everness:coral_forest' },
y_max = y_max,
y_min = y_min,
decoration = { 'everness:coral_burdock_1', 'everness:coral_burdock_2' },
spawn_by = 'everness:coral_tree',
param2 = 8
})
Everness:register_decoration({
name = 'everness:coral_forest_coral_bush',
deco_type = 'simple',
place_on = { 'everness:dirt_with_coral_grass', 'everness:coral_sand', 'everness:coral_white_sand' },
sidelen = 16,
noise_params = {
offset = -0.02,
scale = 0.04,
spread = { x = 200, y = 200, z = 200 },
seed = 436,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:coral_forest' },
y_max = y_max,
y_min = y_min,
decoration = 'everness:coral_bush'
})
Everness:register_decoration({
name = 'everness:coral_forest_coral_shrub',
deco_type = 'simple',
place_on = { 'everness:dirt_with_coral_grass', 'everness:coral_sand', 'everness:coral_white_sand' },
sidelen = 16,
noise_params = {
offset = -0.02,
scale = 0.04,
spread = { x = 200, y = 200, z = 200 },
seed = 1220999,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:coral_forest' },
y_max = y_max,
y_min = y_min,
decoration = 'everness:coral_shrub'
})
local function register_coral_grass_decoration(offset, scale, length)
Everness:register_decoration({
name = 'everness:coral_forest_coral_grass_' .. length,
deco_type = 'simple',
place_on = { 'everness:dirt_with_coral_grass' },
sidelen = 16,
noise_params = {
offset = offset,
scale = scale,
spread = { x = 200, y = 200, z = 200 },
seed = 329,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:coral_forest' },
y_max = y_max,
y_min = y_min,
decoration = 'everness:coral_grass_' .. length,
param2 = 0,
param2_max = 239,
})
end
-- Grasses
register_coral_grass_decoration(-0.03, 0.09, 5)
register_coral_grass_decoration(-0.015, 0.075, 4)
register_coral_grass_decoration(0, 0.06, 3)
register_coral_grass_decoration(0.015, 0.045, 2)
register_coral_grass_decoration(0.03, 0.03, 1)
-- Staghorn Coral
local function register_staghorn_coral_decoration(offset, scale, length)
Everness:register_decoration({
name = 'everness:coral_forest_staghorn_coral_' .. length,
deco_type = 'simple',
place_on = { 'everness:dirt_with_coral_grass', 'everness:coral_sand' },
param2 = 0,
param2_max = 3,
sidelen = 16,
noise_params = {
offset = offset,
scale = scale,
spread = { x = 200, y = 200, z = 200 },
seed = 329,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:coral_forest' },
y_max = y_max,
y_min = y_min,
decoration = 'everness:staghorn_coral_' .. length
})
end
register_staghorn_coral_decoration(-0.03, -0.09, 3)
register_staghorn_coral_decoration(-0.015, -0.075, 2)
register_staghorn_coral_decoration(0, -0.06, 1)
--
-- On Generated
--
local deco_id_coral_bones_tree = core.get_decoration_id('everness:coral_forest_coral_bones_tree')
local biome_id_coral_forest = core.get_biome_id('everness:coral_forest')
local coral_bones_tree_size = { x = 16, y = 35, z = 16 }
Everness:register_gen_notify_decoration(deco_id_coral_bones_tree)
Everness:add_to_queue_on_generated({
name = 'everness:coral_forest',
can_run = function(biomemap, chunk_biomes)
return (chunk_biomes and chunk_biomes[biome_id_coral_forest]) or table.indexof(biomemap, biome_id_coral_forest) ~= -1
end,
after_write_to_map = function(shared_args, gennotify)
--
-- Coral bone tree - fix light
--
for _, pos in ipairs(gennotify['decoration#' .. (deco_id_coral_bones_tree or '')] or {}) do
core.fix_light(
vector.round(vector.new(pos.x - (coral_bones_tree_size.x / 2), pos.y, pos.z - (coral_bones_tree_size.z / 2))),
vector.round(vector.new(pos.x + (coral_bones_tree_size.x / 2), pos.y + coral_bones_tree_size.y, pos.z + (coral_bones_tree_size.z / 2)))
)
end
end
})
@@ -0,0 +1,449 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--
-- Register biomes
--
local y_max = Everness.settings.biomes.everness_coral_forest_deep_ocean.y_max
local y_min = Everness.settings.biomes.everness_coral_forest_deep_ocean.y_min
-- Coral Forest Ocean
Everness:register_biome({
name = 'everness:coral_forest_deep_ocean',
node_top = 'everness:coral_forest_deep_ocean_sand',
depth_top = 1,
node_filler = 'everness:coral_forest_deep_ocean_sand',
depth_filler = 3,
node_riverbed = 'everness:coral_forest_deep_ocean_sand',
depth_riverbed = 2,
node_cave_liquid = 'mapgen_water_source',
node_dungeon = 'everness:coral_deep_ocean_sandstone_block',
node_dungeon_alt = 'everness:coral_deep_ocean_sandstone_brick',
node_dungeon_stair = 'stairs:stair_coral_deep_ocean_sandstone_block',
y_max = y_max,
y_min = y_min,
heat_point = 60,
humidity_point = 50,
})
-- Blob ore.
-- These before scatter ores to avoid other ores in blobs.
-- Coral Desert Stone
Everness:register_ore({
ore_type = 'blob',
ore = 'everness:coral_desert_stone',
wherein = { 'default:stone' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = -316,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:coral_forest_deep_ocean' }
})
--
-- Register decorations
--
-- Coral reef
Everness:register_decoration({
name = 'everness:coral_forest_deep_ocean_coral_reef_pink',
deco_type = 'schematic',
place_on = { 'everness:coral_forest_deep_ocean_sand' },
spawn_by = 'mapgen_water_source',
num_spawn_by = 8,
sidelen = 16,
noise_params = {
offset = -0.004,
scale = 0.01,
spread = { x = 100, y = 100, z = 100 },
seed = 137,
octaves = 3,
persist = 0.7,
},
biomes = { 'everness:coral_forest_deep_ocean' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_coral_forest_deep_ocean_coral_reef_pink.mts',
flags = 'place_center_x, place_center_z, force_placement',
})
Everness:register_decoration({
name = 'everness:coral_forest_deep_ocean_coral_reef_cyan',
deco_type = 'schematic',
place_on = { 'everness:coral_forest_deep_ocean_sand' },
spawn_by = 'mapgen_water_source',
num_spawn_by = 8,
sidelen = 16,
noise_params = {
offset = -0.004,
scale = 0.01,
spread = { x = 100, y = 100, z = 100 },
seed = 137,
octaves = 3,
persist = 0.7,
},
biomes = { 'everness:coral_forest_deep_ocean' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_coral_forest_deep_ocean_coral_reef_cyan.mts',
flags = 'place_center_x, place_center_z, force_placement',
})
Everness:register_decoration({
name = 'everness:coral_forest_deep_ocean_coral_reef_green',
deco_type = 'schematic',
place_on = { 'everness:coral_forest_deep_ocean_sand' },
spawn_by = 'mapgen_water_source',
num_spawn_by = 8,
sidelen = 16,
noise_params = {
offset = -0.004,
scale = 0.01,
spread = { x = 100, y = 100, z = 100 },
seed = 137,
octaves = 3,
persist = 0.7,
},
biomes = { 'everness:coral_forest_deep_ocean' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_coral_forest_deep_ocean_coral_reef_green.mts',
flags = 'place_center_x, place_center_z, force_placement',
})
Everness:register_decoration({
name = 'everness:coral_forest_deep_ocean_coral_reef_red',
deco_type = 'schematic',
place_on = { 'everness:coral_forest_deep_ocean_sand' },
spawn_by = 'mapgen_water_source',
num_spawn_by = 8,
sidelen = 16,
noise_params = {
offset = -0.004,
scale = 0.01,
spread = { x = 100, y = 100, z = 100 },
seed = 137,
octaves = 3,
persist = 0.7,
},
biomes = { 'everness:coral_forest_deep_ocean' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_coral_forest_deep_ocean_coral_reef_red.mts',
flags = 'place_center_x, place_center_z, force_placement',
})
Everness:register_decoration({
name = 'everness:everness_coral_forest_deep_ocean_pink',
deco_type = 'schematic',
place_on = { 'everness:coral_forest_deep_ocean_sand' },
spawn_by = 'mapgen_water_source',
num_spawn_by = 8,
sidelen = 16,
fill_ratio = 0.002,
biomes = { 'everness:coral_forest_deep_ocean' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_coral_forest_deep_ocean_coral_pink.mts',
flags = 'place_center_x, place_center_z, force_placement',
})
Everness:register_decoration({
name = 'everness:everness_coral_forest_deep_ocean_cyan',
deco_type = 'schematic',
place_on = { 'everness:coral_forest_deep_ocean_sand' },
spawn_by = 'mapgen_water_source',
num_spawn_by = 8,
sidelen = 16,
fill_ratio = 0.002,
biomes = { 'everness:coral_forest_deep_ocean' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_coral_forest_deep_ocean_coral_cyan.mts',
flags = 'place_center_x, place_center_z, force_placement',
})
Everness:register_decoration({
name = 'everness:everness_coral_forest_deep_ocean_green',
deco_type = 'schematic',
place_on = { 'everness:coral_forest_deep_ocean_sand' },
spawn_by = 'mapgen_water_source',
num_spawn_by = 8,
sidelen = 16,
fill_ratio = 0.002,
biomes = { 'everness:coral_forest_deep_ocean' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_coral_forest_deep_ocean_coral_green.mts',
flags = 'place_center_x, place_center_z, force_placement',
})
Everness:register_decoration({
name = 'everness:everness_coral_forest_deep_ocean_red',
deco_type = 'schematic',
place_on = { 'everness:coral_forest_deep_ocean_sand' },
spawn_by = 'mapgen_water_source',
num_spawn_by = 8,
sidelen = 16,
fill_ratio = 0.002,
biomes = { 'everness:coral_forest_deep_ocean' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_coral_forest_deep_ocean_coral_red.mts',
flags = 'place_center_x, place_center_z, force_placement',
})
Everness:register_decoration({
name = 'everness:coral_forest_deep_ocean_mud',
deco_type = 'simple',
place_on = { 'everness:coral_forest_deep_ocean_sand' },
place_offset_y = -1,
sidelen = 4,
fill_ratio = 0.002,
biomes = { 'everness:coral_forest_deep_ocean' },
y_max = y_max,
y_min = y_min,
flags = 'force_placement',
decoration = { 'everness:coral_deep_ocean_mud' },
spawn_by = 'mapgen_water_source',
num_spawn_by = 8,
})
Everness:register_decoration({
name = 'everness:coral_forest_deep_ocean_plants_1',
deco_type = 'simple',
place_on = { 'everness:coral_forest_deep_ocean_sand' },
place_offset_y = -1,
sidelen = 4,
noise_params = {
offset = 0,
scale = 0.02,
spread = { x = 200, y = 200, z = 200 },
seed = 329,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:coral_forest_deep_ocean' },
y_max = y_max,
y_min = y_min,
flags = 'force_placement',
decoration = { 'everness:coral_forest_deep_ocean_coral_plant_1' },
spawn_by = 'mapgen_water_source',
num_spawn_by = 8,
})
Everness:register_decoration({
name = 'everness:coral_forest_deep_ocean_plants_2',
deco_type = 'simple',
place_on = { 'everness:coral_forest_deep_ocean_sand' },
place_offset_y = -1,
sidelen = 4,
noise_params = {
offset = -0.02,
scale = 0.04,
spread = { x = 200, y = 200, z = 200 },
seed = 436,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:coral_forest_deep_ocean' },
y_max = y_max,
y_min = y_min,
flags = 'force_placement',
decoration = { 'everness:coral_forest_deep_ocean_coral_plant_2' },
spawn_by = 'mapgen_water_source',
num_spawn_by = 8,
})
Everness:register_decoration({
name = 'everness:coral_forest_deep_ocean_plants_3',
deco_type = 'simple',
place_on = { 'everness:coral_forest_deep_ocean_sand' },
place_offset_y = -1,
sidelen = 4,
noise_params = {
offset = -0.02,
scale = 0.04,
spread = { x = 200, y = 200, z = 200 },
seed = 19822,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:coral_forest_deep_ocean' },
y_max = y_max,
y_min = y_min,
flags = 'force_placement',
decoration = { 'everness:coral_forest_deep_ocean_coral_plant_3' },
spawn_by = 'mapgen_water_source',
num_spawn_by = 8,
})
--
-- On Generated
--
local c_water_source = core.get_content_id('mapgen_water_source')
local c_everness_coral_forest_deep_ocean_sand = core.get_content_id('everness:coral_forest_deep_ocean_sand')
local c_everness_coral_forest_deep_ocean_coral_plant_1 = core.get_content_id('everness:coral_forest_deep_ocean_coral_plant_1')
local c_everness_coral_forest_deep_ocean_coral_plant_2 = core.get_content_id('everness:coral_forest_deep_ocean_coral_plant_2')
local c_everness_coral_forest_deep_ocean_coral_plant_3 = core.get_content_id('everness:coral_forest_deep_ocean_coral_plant_3')
local c_everness_coral_forest_deep_ocean_coral_1 = core.get_content_id('everness:coral_forest_deep_ocean_coral_1')
local c_everness_coral_forest_deep_ocean_coral_2 = core.get_content_id('everness:coral_forest_deep_ocean_coral_2')
local c_everness_coral_forest_deep_ocean_coral_3 = core.get_content_id('everness:coral_forest_deep_ocean_coral_3')
local c_everness_coral_forest_deep_ocean_coral_4 = core.get_content_id('everness:coral_forest_deep_ocean_coral_4')
-- Biome IDs
local biome_id_everness_coral_forest_deep_ocean = core.get_biome_id('everness:coral_forest_deep_ocean')
local chance = 30
local schem = core.get_modpath('everness') .. '/schematics/everness_coral_forest_deep_ocean_house.mts'
local size = { x = 11, y = 17, z = 12 }
local size_x = math.round(size.x / 2)
local size_z = math.round(size.z / 2)
Everness:add_to_queue_on_generated({
name = 'everness:coral_forest_deep_ocean',
can_run = function(biomemap, chunk_biomes)
return (chunk_biomes and chunk_biomes[biome_id_everness_coral_forest_deep_ocean]) or table.indexof(biomemap, biome_id_everness_coral_forest_deep_ocean) ~= -1
end,
after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args)
shared_args.schem_positions = {}
local schem_placed = false
if rand:next(0, 100) < chance then
for y = maxp.y, minp.y, -1 do
if schem_placed then
break
end
for z = minp.z, maxp.z do
if schem_placed then
break
end
for x = minp.x, maxp.x do
local vi = area:index(x, y, z)
if
data[vi] == c_everness_coral_forest_deep_ocean_sand
and data[vi + area.ystride] == c_water_source
then
local s_pos = area:position(vi)
--
-- Coral Forest Deep Ocean House
--
local schem_pos = vector.new(s_pos)
-- find floor big enough
local indexes = Everness.find_content_in_vm_area(
vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z),
{
c_everness_coral_forest_deep_ocean_sand,
c_everness_coral_forest_deep_ocean_coral_plant_1,
c_everness_coral_forest_deep_ocean_coral_plant_2,
c_everness_coral_forest_deep_ocean_coral_plant_3,
c_everness_coral_forest_deep_ocean_coral_1,
c_everness_coral_forest_deep_ocean_coral_2,
c_everness_coral_forest_deep_ocean_coral_3,
c_everness_coral_forest_deep_ocean_coral_4
},
data,
area
)
if #indexes < size.x * size.z then
-- not enough space
return
end
-- enough water to place structure ?
local water_indexes = Everness.find_content_in_vm_area(
vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z),
{
c_water_source
},
data,
area
)
if #water_indexes > (size.x * size.y * size.z) / 2 then
core.place_schematic_on_vmanip(
vm,
schem_pos,
schem,
'random',
nil,
true,
'place_center_x, place_center_z'
)
schem_placed = true
shared_args.schem_positions.everness_coral_forest_deep_ocean_house = shared_args.schem_positions.everness_coral_forest_deep_ocean_house or {}
table.insert(shared_args.schem_positions.everness_coral_forest_deep_ocean_house, {
pos = schem_pos,
minp = vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z),
maxp = vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z)
})
core.log('action', '[Everness] Coral Forest Deep Ocean House was placed at ' .. schem_pos:to_string())
break
end
end
end
end
end
end
end,
after_write_to_map = function(shared_args)
local schem_positions = shared_args.schem_positions or {}
for name, tbl in pairs(schem_positions) do
if next(tbl) then
for i, v in ipairs(tbl) do
local chest_positions = core.find_nodes_in_area(
v.minp,
v.maxp,
{ 'everness:chest' }
)
if #chest_positions > 0 then
Everness:populate_loot_chests(chest_positions)
end
end
end
end
end
})
+303
View File
@@ -0,0 +1,303 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--
-- Register biomes
--
local y_max = Everness.settings.biomes.everness_coral_forest_dunes.y_max
local y_min = Everness.settings.biomes.everness_coral_forest_dunes.y_min
-- Coral Forest Dunes
Everness:register_biome({
name = 'everness:coral_forest_dunes',
node_top = 'everness:coral_sand',
depth_top = 1,
node_filler = 'everness:coral_sand',
depth_filler = 3,
node_riverbed = 'everness:coral_sand',
depth_riverbed = 2,
node_stone = 'everness:coral_desert_stone',
node_dungeon = 'everness:coral_sandstone',
node_dungeon_alt = 'everness:coral_sandstone_brick',
node_dungeon_stair = 'stairs:stair_coral_sandstone',
vertical_blend = 1,
y_max = y_max,
y_min = y_min,
heat_point = 60,
humidity_point = 50,
})
--
-- Register ores
--
-- Blob ore.
-- These before scatter ores to avoid other ores in blobs.
-- Coral sand
Everness:register_ore({
ore_type = 'blob',
ore = 'everness:coral_sand',
wherein = { 'everness:coral_desert_stone' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = 2316,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:coral_forest_dunes' }
})
-- Dirt
Everness:register_ore({
ore_type = 'blob',
ore = 'everness:coral_dirt',
wherein = { 'everness:coral_desert_stone' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = 17676,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:coral_forest_dunes' }
})
-- Scatter ores
-- Coal
Everness:register_ore({
ore_type = 'scatter',
ore = 'everness:coral_desert_stone_with_coal',
wherein = 'everness:coral_desert_stone',
clust_scarcity = 8 * 8 * 8,
clust_num_ores = 9,
clust_size = 3,
y_max = y_max,
y_min = y_min,
biomes = { 'everness:coral_forest_dunes' }
})
--
-- Register decorations
--
-- Coral Forest Dunes
Everness:register_decoration({
name = 'everness:coral_forest_dunes_coral_volcano',
deco_type = 'schematic',
place_on = { 'everness:coral_sand' },
place_offset_y = 0,
sidelen = 16,
noise_params = {
offset = -0.012,
scale = 0.024,
spread = { x = 100, y = 100, z = 100 },
seed = 230,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:coral_forest_dunes' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('x_clay')
and core.get_modpath('everness') .. '/schematics/everness_coral_volcano_x_clay.mts'
or core.get_modpath('everness') .. '/schematics/everness_coral_volcano.mts',
flags = 'place_center_x, place_center_z',
rotation = 'random',
spawn_by = 'everness:coral_sand',
num_spawn_by = 8
})
Everness:register_decoration({
name = 'everness:coral_forest_dunes_coral_bush',
deco_type = 'simple',
place_on = { 'everness:dirt_with_coral_grass', 'everness:coral_sand', 'everness:coral_white_sand' },
sidelen = 16,
noise_params = {
offset = -0.02,
scale = 0.04,
spread = { x = 200, y = 200, z = 200 },
seed = 436,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:coral_forest_dunes' },
y_max = y_max,
y_min = y_min,
decoration = 'everness:coral_bush'
})
Everness:register_decoration({
name = 'everness:coral_forest_dunes_coral_shrub',
deco_type = 'simple',
place_on = { 'everness:dirt_with_coral_grass', 'everness:coral_sand', 'everness:coral_white_sand' },
sidelen = 16,
noise_params = {
offset = -0.02,
scale = 0.04,
spread = { x = 200, y = 200, z = 200 },
seed = 1220999,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:coral_forest_dunes' },
y_max = y_max,
y_min = y_min,
decoration = 'everness:coral_shrub'
})
--
-- On Generated
--
local disp = 16
local chance = 5
local water_level = tonumber(core.settings:get('water_level')) or 1
local schem = core.get_modpath('everness') .. '/schematics/everness_coral_forest_ocean_fishing_dock.mts'
local size = { x = 26, y = 10, z = 23 }
local size_x = math.round(size.x / 2)
local size_z = math.round(size.z / 2)
local y_dis = 1
local c_water_source = core.get_content_id('mapgen_water_source')
local biome_id_everness_coral_forest_dunes = core.get_biome_id('everness:coral_forest_dunes')
Everness:add_to_queue_on_generated({
name = 'everness:coral_forest_dunes',
can_run = function(biomemap, chunk_biomes)
return (chunk_biomes and chunk_biomes[biome_id_everness_coral_forest_dunes]) or table.indexof(biomemap, biome_id_everness_coral_forest_dunes) ~= -1
end,
after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args)
local sidelength = maxp.x - minp.x + 1
local x_disp = rand:next(0, disp)
local z_disp = rand:next(0, disp)
shared_args.schem_positions = {}
if rand:next(0, 100) < chance then
for y = minp.y, maxp.y do
local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp)
if data[vi + area.ystride] == core.CONTENT_AIR
and data[vi] == c_water_source
-- Water Level
and water_level >= minp.y
and water_level <= maxp.y
then
local s_pos = area:position(vi)
--
-- Coral Forest Ocean Fishing Dock
--
local schem_pos = vector.new(s_pos.x, s_pos.y - y_dis, s_pos.z)
-- find floor big enough
local indexes = Everness.find_content_in_vm_area(
vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z),
{
c_water_source,
core.CONTENT_AIR
},
data,
area
)
if #indexes < size.x * size.z then
-- not enough space
return
end
-- enough space to place structure ?
local space_indexes = Everness.find_content_in_vm_area(
vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z),
{
c_water_source,
core.CONTENT_AIR
},
data,
area
)
if #space_indexes > (size.x * size.y * size.z) / 2 then
core.place_schematic_on_vmanip(
vm,
schem_pos,
schem,
'random',
nil,
true,
'place_center_x, place_center_z'
)
shared_args.schem_positions.everness_coral_forest_ocean_fishing_dock = shared_args.schem_positions.everness_coral_forest_ocean_fishing_dock or {}
table.insert(shared_args.schem_positions.everness_coral_forest_ocean_fishing_dock, {
pos = schem_pos,
minp = vector.new(s_pos.x - size_x, s_pos.y - y_dis, s_pos.z - size_z),
maxp = vector.new(s_pos.x + size_x, s_pos.y - y_dis + size.y, s_pos.z + size_z)
})
core.log('action', '[Everness] Coral Forest Ocean Fishing Dock was placed at ' .. schem_pos:to_string())
break
end
end
end
end
end,
after_write_to_map = function(shared_args)
local schem_positions = shared_args.schem_positions or {}
for name, tbl in pairs(schem_positions) do
if next(tbl) then
for i, v in ipairs(tbl) do
local chest_positions = core.find_nodes_in_area(
v.minp,
v.maxp,
{ 'everness:chest' }
)
if #chest_positions > 0 then
Everness:populate_loot_chests(chest_positions)
end
end
end
end
end
})
+284
View File
@@ -0,0 +1,284 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--
-- Register biomes
--
local y_max = Everness.settings.biomes.everness_coral_forest_ocean.y_max
local y_min = Everness.settings.biomes.everness_coral_forest_ocean.y_min
-- Coral Forest Ocean
Everness:register_biome({
name = 'everness:coral_forest_ocean',
node_top = 'everness:coral_white_sand',
depth_top = 1,
node_filler = 'everness:coral_white_sand',
depth_filler = 3,
node_riverbed = 'everness:coral_white_sand',
depth_riverbed = 2,
node_stone = 'everness:coral_desert_stone',
node_cave_liquid = 'mapgen_water_source',
node_dungeon = 'everness:coral_desert_cobble',
node_dungeon_alt = 'everness:coral_desert_mossy_cobble',
node_dungeon_stair = 'stairs:stair_coral_desert_cobble',
y_max = y_max,
y_min = y_min,
heat_point = 60,
humidity_point = 50,
})
-- Blob ore.
-- These before scatter ores to avoid other ores in blobs.
-- Clay
Everness:register_ore({
ore_type = 'blob',
ore = 'default:clay',
wherein = { 'everness:coral_white_sand' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = -316,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:coral_forest_ocean' }
})
-- Coral sand
Everness:register_ore({
ore_type = 'blob',
ore = 'everness:coral_sand',
wherein = { 'everness:coral_desert_stone' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = 2316,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:coral_forest_ocean' }
})
-- Dirt
Everness:register_ore({
ore_type = 'blob',
ore = 'everness:coral_dirt',
wherein = { 'everness:coral_desert_stone' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = 17676,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:coral_forest_ocean' }
})
-- Scatter ores
-- Coal
Everness:register_ore({
ore_type = 'scatter',
ore = 'everness:coral_desert_stone_with_coal',
wherein = 'everness:coral_desert_stone',
clust_scarcity = 8 * 8 * 8,
clust_num_ores = 9,
clust_size = 3,
y_max = y_max,
y_min = y_min,
biomes = { 'everness:coral_forest_ocean' }
})
--
-- Register decorations
--
-- Coral Forest Under
-- Coral reef
Everness:register_decoration({
name = 'everness:coral_forest_ocean_corals',
deco_type = 'simple',
place_on = { 'everness:coral_white_sand' },
place_offset_y = -1,
sidelen = 4,
noise_params = {
offset = -4,
scale = 4,
spread = { x = 50, y = 50, z = 50 },
seed = 7013,
octaves = 3,
persist = 0.7,
},
biomes = { 'everness:coral_forest_ocean' },
y_max = y_max - 5 > y_min and y_max - 5 or y_max,
y_min = y_max - 11 > y_min and y_max - 11 or y_min,
flags = 'force_placement',
decoration = {
'everness:coral_corals',
'everness:coral_jellyfish',
'everness:coral_skeleton'
},
})
--
-- On Generated
--
local disp = 16
local chance = 5
local water_level = tonumber(core.settings:get('water_level')) or 1
local schem = core.get_modpath('everness') .. '/schematics/everness_coral_forest_ocean_fishing_dock.mts'
local size = { x = 26, y = 10, z = 23 }
local size_x = math.round(size.x / 2)
local size_z = math.round(size.z / 2)
local y_dis = 1
local c_water_source = core.get_content_id('mapgen_water_source')
local biome_id_everness_coral_forest_ocean = core.get_biome_id('everness:coral_forest_ocean')
Everness:add_to_queue_on_generated({
name = 'everness:coral_forest_ocean',
can_run = function(biomemap, chunk_biomes)
return (chunk_biomes and chunk_biomes[biome_id_everness_coral_forest_ocean]) or table.indexof(biomemap, biome_id_everness_coral_forest_ocean) ~= -1
end,
after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args)
local sidelength = maxp.x - minp.x + 1
local x_disp = rand:next(0, disp)
local z_disp = rand:next(0, disp)
shared_args.schem_positions = {}
if rand:next(0, 100) < chance then
for y = minp.y, maxp.y do
local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp)
if data[vi + area.ystride] == core.CONTENT_AIR
and data[vi] == c_water_source
-- Water Level
and water_level >= minp.y
and water_level <= maxp.y
then
local s_pos = area:position(vi)
--
-- Coral Forest Ocean Fishing Dock
--
local schem_pos = vector.new(s_pos.x, s_pos.y - y_dis, s_pos.z)
-- find floor big enough
local indexes = Everness.find_content_in_vm_area(
vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z),
{
c_water_source,
core.CONTENT_AIR
},
data,
area
)
if #indexes < size.x * size.z then
-- not enough space
return
end
-- enough space to place structure ?
local space_indexes = Everness.find_content_in_vm_area(
vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z),
{
c_water_source,
core.CONTENT_AIR
},
data,
area
)
if #space_indexes > (size.x * size.y * size.z) / 2 then
core.place_schematic_on_vmanip(
vm,
schem_pos,
schem,
'random',
nil,
true,
'place_center_x, place_center_z'
)
shared_args.schem_positions.everness_coral_forest_ocean_fishing_dock = shared_args.schem_positions.everness_coral_forest_ocean_fishing_dock or {}
table.insert(shared_args.schem_positions.everness_coral_forest_ocean_fishing_dock, {
pos = schem_pos,
minp = vector.new(s_pos.x - size_x, s_pos.y - y_dis, s_pos.z - size_z),
maxp = vector.new(s_pos.x + size_x, s_pos.y - y_dis + size.y, s_pos.z + size_z)
})
core.log('action', '[Everness] Coral Forest Ocean Fishing Dock was placed at ' .. schem_pos:to_string())
break
end
end
end
end
end,
after_write_to_map = function(shared_args)
local schem_positions = shared_args.schem_positions or {}
for name, tbl in pairs(schem_positions) do
if next(tbl) then
for i, v in ipairs(tbl) do
local chest_positions = core.find_nodes_in_area(
v.minp,
v.maxp,
{ 'everness:chest' }
)
if #chest_positions > 0 then
Everness:populate_loot_chests(chest_positions)
end
end
end
end
end
})
+290
View File
@@ -0,0 +1,290 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--
-- Register biomes
--
local y_max = Everness.settings.biomes.everness_coral_forest_under.y_max
local y_min = Everness.settings.biomes.everness_coral_forest_under.y_min
-- Coral Forest Under
Everness:register_biome({
name = 'everness:coral_forest_under',
node_cave_liquid = { 'mapgen_water_source', 'mapgen_lava_source' },
node_dungeon = 'everness:coral_desert_cobble',
node_dungeon_alt = 'everness:coral_desert_mossy_cobble',
node_dungeon_stair = 'stairs:stair_coral_desert_cobble',
y_max = y_max,
y_min = y_min,
heat_point = 60,
humidity_point = 50,
})
--
-- Register ores
--
-- Blob ore.
-- These before scatter ores to avoid other ores in blobs.
-- Coral Desert Stone
Everness:register_ore({
ore_type = 'blob',
ore = 'everness:coral_desert_stone',
wherein = { 'default:stone' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = -316,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:coral_forest_under' }
})
--
-- Register decorations
--
-- Coral Forest Under
Everness:register_decoration({
name = 'everness:coral_forest_under_desert_stone_with_moss_floors',
deco_type = 'simple',
place_on = { 'default:stone' },
place_offset_y = -1,
sidelen = 16,
fill_ratio = 10,
biomes = { 'everness:coral_forest_under' },
y_max = y_max,
y_min = y_min,
flags = 'all_floors, force_placement',
decoration = {
'everness:coral_desert_stone_with_moss'
},
})
Everness:register_decoration({
name = 'everness:coral_forest_under_mold_stone_ceilings',
deco_type = 'simple',
place_on = { 'default:stone' },
sidelen = 16,
fill_ratio = 0.4,
biomes = { 'everness:coral_forest_under' },
y_max = y_max,
y_min = y_min,
flags = 'all_ceilings',
decoration = {
'everness:moss_block'
},
})
Everness:register_decoration({
name = 'everness:coral_forest_under_coral_tree_bioluminescent',
deco_type = 'simple',
place_on = { 'everness:coral_desert_stone_with_moss' },
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.002,
spread = { x = 250, y = 250, z = 250 },
seed = 2,
octaves = 3,
persist = 0.66
},
biomes = { 'everness:coral_forest_under' },
y_max = y_max - 1500 > y_min and y_max - 1500 or y_max,
y_min = y_min,
flags = 'all_floors',
decoration = {
'everness:marker'
},
})
Everness:register_decoration({
name = 'everness:coral_forest_under_coral_plant_bioluminescent',
deco_type = 'simple',
place_on = { 'everness:coral_desert_stone_with_moss' },
param2 = 8,
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.02,
spread = { x = 200, y = 200, z = 200 },
seed = 329,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:coral_forest_under' },
y_max = y_max,
y_min = y_min,
decoration = 'everness:coral_plant_bioluminescent',
flags = 'all_floors'
})
Everness:register_decoration({
name = 'everness:coral_forest_under_lumecorn',
deco_type = 'simple',
place_on = { 'everness:coral_desert_stone_with_moss' },
sidelen = 16,
noise_params = {
offset = -0.004,
scale = 0.01,
spread = { x = 100, y = 100, z = 100 },
seed = 137,
octaves = 3,
persist = 0.7,
},
biomes = { 'everness:coral_forest_under' },
y_max = y_max - 1000 > y_min and y_max - 1000 or y_max,
y_min = y_min,
decoration = 'everness:lumecorn',
flags = 'all_floors',
})
Everness:register_decoration({
name = 'everness:coral_forest_under_vines',
deco_type = 'simple',
place_on = { 'everness:moss_block' },
sidelen = 16,
fill_ratio = 0.09,
biomes = { 'everness:coral_forest_under' },
param2 = 8,
decoration = {
'everness:lumabus_vine_1',
'everness:lumabus_vine_2',
'everness:flowered_vine_1',
'everness:flowered_vine_2'
},
y_max = y_max,
y_min = y_min,
flags = 'all_ceilings',
spawn_by = 'air',
num_spawn_by = 8
})
Everness:register_decoration({
name = 'everness:coral_forest_under_plants',
deco_type = 'simple',
place_on = { 'everness:coral_desert_stone_with_moss' },
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.02,
spread = { x = 200, y = 200, z = 200 },
seed = 329,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:coral_forest_under' },
y_max = y_max - 500 > y_min and y_max - 500 or y_max,
y_min = y_min,
decoration = {
'everness:coral_grass_orange',
'everness:globulagus',
'everness:coral_grass_tall',
},
flags = 'all_floors',
})
--
-- On Generated
--
local biome_id_everness_coral_forest_under = core.get_biome_id('everness:coral_forest_under')
local deco_id_coral_forest_under_coral_tree_bioluminescent = core.get_decoration_id('everness:coral_forest_under_coral_tree_bioluminescent')
local schem_bioluminescent_tree = core.get_modpath('everness') .. '/schematics/everness_coral_tree_bioluminescent.mts'
local coral_bioluminescent_tree_size = { x = 15, y = 17, z = 15 }
local bioluminescent_tree_size_x = math.round(coral_bioluminescent_tree_size.x / 2)
local bioluminescent_tree_size_z = math.round(coral_bioluminescent_tree_size.z / 2)
local bioluminescent_tree_safe_volume = (coral_bioluminescent_tree_size.x * coral_bioluminescent_tree_size.y * coral_bioluminescent_tree_size.z) / 1.5
local bioluminescent_tree_y_dis = 1
local bioluminescent_tree_place_on = Everness.to_set(core.registered_decorations['everness:coral_forest_under_coral_tree_bioluminescent'].place_on)
Everness:register_gen_notify_decoration(deco_id_coral_forest_under_coral_tree_bioluminescent)
Everness:add_to_queue_on_generated({
name = 'everness:coral_forest_under',
can_run = function(biomemap, chunk_biomes)
return (chunk_biomes and chunk_biomes[biome_id_everness_coral_forest_under]) or table.indexof(biomemap, biome_id_everness_coral_forest_under) ~= -1
end,
after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args)
--
-- Coral Tree Bioluminescent
--
for _, pos in ipairs(gennotify['decoration#' .. (deco_id_coral_forest_under_coral_tree_bioluminescent or '')] or {}) do
-- `pos` is position of the 'place_on' node
local marker_pos = vector.new(pos.x, pos.y + 1, pos.z)
local marker_node = core.get_node(marker_pos)
local place_on_node = core.get_node(pos)
if marker_node and marker_node.name == 'everness:marker' then
-- remove marker
core.remove_node(marker_pos)
if place_on_node and bioluminescent_tree_place_on[place_on_node.name] then
-- enough air to place structure ?
local positions = core.find_nodes_in_area(
vector.new(
pos.x - bioluminescent_tree_size_x,
pos.y - bioluminescent_tree_y_dis,
pos.z - bioluminescent_tree_size_z
),
vector.new(
pos.x + bioluminescent_tree_size_x,
pos.y - bioluminescent_tree_y_dis + coral_bioluminescent_tree_size.y,
pos.z + bioluminescent_tree_size_z
),
{
'air',
'everness:coral_tree'
},
true
)
local air = positions.air or {}
local tree = positions['everness:coral_tree'] or {}
-- do not overlap another tree
if #tree == 0 and #air > bioluminescent_tree_safe_volume then
core.place_schematic_on_vmanip(
vm,
vector.new(marker_pos.x, marker_pos.y - bioluminescent_tree_y_dis, marker_pos.z),
schem_bioluminescent_tree,
'random',
nil,
true,
'place_center_x, place_center_z'
)
-- core.log('action', '[Everness] Coral Tree Bioluminescent was placed at ' .. pos:to_string())
end
end
end
end
end
})
+569
View File
@@ -0,0 +1,569 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--
-- Register biomes
--
local y_max = Everness.settings.biomes.everness_crystal_forest.y_max
local y_min = Everness.settings.biomes.everness_crystal_forest.y_min
-- Crystal Forest
Everness:register_biome({
name = 'everness:crystal_forest',
node_top = 'everness:dirt_with_crystal_grass',
depth_top = 1,
node_filler = 'everness:crystal_dirt',
depth_filler = 1,
node_riverbed = 'everness:crystal_dirt',
depth_riverbed = 2,
node_stone = 'everness:crystal_stone',
node_dungeon = 'everness:crystal_cobble',
node_dungeon_alt = 'everness:crystal_mossy_cobble',
node_dungeon_stair = 'stairs:stair_crystal_cobble',
y_max = y_max,
y_min = y_min,
heat_point = 35,
humidity_point = 50,
})
--
-- Register ores
--
-- Blob ore.
-- These before scatter ores to avoid other ores in blobs.
-- Crystal sand
Everness:register_ore({
ore_type = 'blob',
ore = 'everness:crystal_sand',
wherein = { 'everness:crystal_stone' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = 2316,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:crystal_forest' }
})
-- Dirt
Everness:register_ore({
ore_type = 'blob',
ore = 'everness:crystal_dirt',
wherein = { 'everness:crystal_stone' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = 17676,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:crystal_forest' }
})
-- Scatter ores
-- Coal
Everness:register_ore({
ore_type = 'scatter',
ore = 'everness:crystal_stone_with_coal',
wherein = 'everness:crystal_stone',
clust_scarcity = 8 * 8 * 8,
clust_num_ores = 9,
clust_size = 3,
y_max = y_max,
y_min = y_min,
biomes = { 'everness:crystal_forest' }
})
--
-- Register decorations
--
Everness:register_decoration({
name = 'everness:crystal_forest_crystal_mushrooms',
deco_type = 'simple',
place_on = { 'everness:dirt_with_crystal_grass' },
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.006,
spread = { x = 250, y = 250, z = 250 },
seed = 2,
octaves = 3,
persist = 0.66
},
biomes = { 'everness:crystal_forest' },
y_max = y_max,
y_min = y_min,
decoration = 'everness:crystal_mushrooms',
param2 = 40
})
Everness:register_decoration({
name = 'everness:crystal_forest_crystal_tree',
deco_type = 'schematic',
place_on = { 'everness:dirt_with_crystal_grass' },
place_offset_y = 0,
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.002,
spread = { x = 250, y = 250, z = 250 },
seed = 2,
octaves = 3,
persist = 0.66
},
biomes = { 'everness:crystal_forest' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_crystal_tree.mts',
flags = 'place_center_x, place_center_z',
rotation = 'random',
})
Everness:register_decoration({
name = 'everness:crystal_forest_crystal_tree_large',
deco_type = 'schematic',
place_on = { 'everness:dirt_with_crystal_grass' },
place_offset_y = 0,
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.001,
spread = { x = 250, y = 250, z = 250 },
seed = 2,
octaves = 3,
persist = 0.66
},
biomes = { 'everness:crystal_forest' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_crystal_tree_large.mts',
flags = 'place_center_x, place_center_z',
rotation = 'random',
})
Everness:register_decoration({
name = 'everness:crystal_forest_crystal_bush',
deco_type = 'schematic',
place_on = { 'everness:dirt_with_crystal_grass' },
sidelen = 16,
place_offset_y = 1,
noise_params = {
offset = -0.004,
scale = 0.01,
spread = { x = 100, y = 100, z = 100 },
seed = 137,
octaves = 3,
persist = 0.7,
},
biomes = { 'everness:crystal_forest' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_crystal_bush.mts',
flags = 'place_center_x, place_center_z',
})
local function register_crystal_grass_decoration(offset, scale, length)
Everness:register_decoration({
name = 'everness:crystal_forest_crystal_grass_' .. length,
deco_type = 'simple',
place_on = { 'everness:dirt_with_crystal_grass' },
sidelen = 16,
noise_params = {
offset = offset,
scale = scale,
spread = { x = 200, y = 200, z = 200 },
seed = 329,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:crystal_forest' },
y_max = y_max,
y_min = y_min,
decoration = 'everness:crystal_grass_' .. length,
param2 = 0,
param2_max = 239,
})
end
-- Crystal Grasses
register_crystal_grass_decoration(-0.03, 0.09, 3)
register_crystal_grass_decoration(-0.015, 0.075, 2)
register_crystal_grass_decoration(0, 0.06, 1)
--
-- On Generated
--
local chance = 20
local disp = 16
local schem = core.get_modpath('everness') .. '/schematics/everness_quartz_temple.mts'
local size = { x = 16, y = 13, z = 16 }
local math_sin = math.sin
local math_floor = math.floor
local math_sqrt = math.sqrt
local math_min = math.min
local math_max = math.max
local size_x = math_floor(size.x / 2)
local size_z = math_floor(size.z / 2)
local y_dis = 1
local c_dirt_with_crystal_grass = core.get_content_id('everness:dirt_with_crystal_grass')
local c_megalith_1 = core.get_content_id('everness:crystal_megalith_1')
local c_megalith_2 = core.get_content_id('everness:crystal_megalith_2')
local c_megalith_3 = core.get_content_id('everness:crystal_megalith_3')
local c_megalith_4 = core.get_content_id('everness:crystal_megalith_4')
local c_megalith_5 = core.get_content_id('everness:crystal_megalith_5')
local c_cluster = core.get_content_id('everness:crystal_cluster')
local is_replaceable = {
[core.CONTENT_AIR] = true,
[core.get_content_id('everness:crystal_grass_1')] = true,
[core.get_content_id('everness:crystal_grass_2')] = true,
[core.get_content_id('everness:crystal_grass_3')] = true,
}
local np_crystal_grass = {
offset = 0,
scale = 1,
spread = { x = 200, y = 200, z = 200 },
seed = 329,
octaves = 3,
persist = 0.6,
}
local nobj_crystal_grass = nil
local grass_noise_buf = {}
local points_x = {}
local points_z = {}
local function place_megalith(data, p2data, vi, ystride, height, pal_idx, rot)
local p2 = pal_idx * 32 + rot
if height == 9 then
-- 9-tall Megalith: 1 -> 2 -> 2 -> 3 -> 3 -> 4 -> 4 -> 4 -> 5
data[vi + ystride * 1] = c_megalith_1
data[vi + ystride * 2] = c_megalith_2
data[vi + ystride * 3] = c_megalith_2
data[vi + ystride * 4] = c_megalith_3
data[vi + ystride * 5] = c_megalith_3
data[vi + ystride * 6] = c_megalith_4
data[vi + ystride * 7] = c_megalith_4
data[vi + ystride * 8] = c_megalith_4
data[vi + ystride * 9] = c_megalith_5
for i = 1, 9 do p2data[vi + ystride * i] = p2 end
elseif height == 7 then
-- 7-tall Megalith: 1 -> 2 -> 3 -> 3 -> 4 -> 4 -> 5
data[vi + ystride * 1] = c_megalith_1
data[vi + ystride * 2] = c_megalith_2
data[vi + ystride * 3] = c_megalith_3
data[vi + ystride * 4] = c_megalith_3
data[vi + ystride * 5] = c_megalith_4
data[vi + ystride * 6] = c_megalith_4
data[vi + ystride * 7] = c_megalith_5
for i = 1, 7 do p2data[vi + ystride * i] = p2 end
elseif height == 5 then
-- 5-tall Megalith: 1 -> 2 -> 3 -> 4 -> 5
data[vi + ystride * 1] = c_megalith_1
data[vi + ystride * 2] = c_megalith_2
data[vi + ystride * 3] = c_megalith_3
data[vi + ystride * 4] = c_megalith_4
data[vi + ystride * 5] = c_megalith_5
for i = 1, 5 do p2data[vi + ystride * i] = p2 end
elseif height == 3 then
-- 3-tall Spire: 1 -> 4 -> 5
data[vi + ystride * 1] = c_megalith_1
data[vi + ystride * 2] = c_megalith_4
data[vi + ystride * 3] = c_megalith_5
for i = 1, 3 do p2data[vi + ystride * i] = p2 end
end
end
local np_heat = {
offset = 50,
scale = 50,
spread = { x = 1000, y = 1000, z = 1000 },
seed = 5349,
octaves = 3,
persist = 0.5,
}
local nobj_heat = nil
local function get_heat_at(x, z, col_idx, heatmap)
if heatmap and heatmap[col_idx] then
return heatmap[col_idx]
end
if not nobj_heat then
if core.get_perlin then
nobj_heat = core.get_perlin(np_heat)
elseif PerlinNoise then
nobj_heat = PerlinNoise(np_heat)
end
end
if nobj_heat then
return nobj_heat:get_2d({ x = x, y = z })
end
return 35
end
local function get_crystal_palette_index(heat, x, z)
-- Map Crystal Forest biome heat window (~18 to ~52, centered at heat_point 35) to full palette (0 to 7)
local min_biome_heat = 18.0
local max_biome_heat = 52.0
local norm_heat = math_min(math_max((heat - min_biome_heat) / (max_biome_heat - min_biome_heat), 0.0), 1.0)
local base_idx = math_floor(norm_heat * 8)
if base_idx >= 8 then
base_idx = 7
end
-- Subtle micro-variation (+/- 1 palette step) based on local position
local jitter = ((x * 13 + z * 17) % 3) - 1
local pal_idx = base_idx + jitter
if pal_idx < 0 then
pal_idx = 0
elseif pal_idx > 7 then
pal_idx = 7
end
return pal_idx
end
local biome_id_everness_crystal_forest = core.get_biome_id('everness:crystal_forest')
Everness:add_to_queue_on_generated({
name = 'everness:crystal_forest',
can_run = function(biomemap, chunk_biomes)
return (chunk_biomes and chunk_biomes[biome_id_everness_crystal_forest]) or table.indexof(biomemap, biome_id_everness_crystal_forest) ~= -1
end,
on_data = function(minp, maxp, area, data, p2data, gennotify, rand, shared_args)
local cell_size = 192
local max_edge_dist = 68.0
local ystride = area.ystride
local chunk_size_x = maxp.x - minp.x + 1
local chunk_size_z = maxp.z - minp.z + 1
-- 1. Precompute 2D grass noise flat buffer in C++ (eliminates thousands of Lua-C calls & table allocations)
if not nobj_crystal_grass then
if core.get_perlin_map then
nobj_crystal_grass = core.get_perlin_map(np_crystal_grass, { x = chunk_size_x, y = chunk_size_z, z = 1 })
elseif PerlinNoiseMap then
nobj_crystal_grass = PerlinNoiseMap(np_crystal_grass, { x = chunk_size_x, y = chunk_size_z, z = 1 })
end
end
if nobj_crystal_grass then
nobj_crystal_grass:get_2d_map_flat({ x = minp.x, y = minp.z }, grass_noise_buf)
end
-- 2. Precompute the small set of Worley feature points covering this chunk once (reduces trig calls by 99.99%)
local min_gx = math_floor(minp.x / cell_size) - 1
local max_gx = math_floor(maxp.x / cell_size) + 1
local min_gz = math_floor(minp.z / cell_size) - 1
local max_gz = math_floor(maxp.z / cell_size) + 1
local num_pts = 0
for cx = min_gx, max_gx do
for cz = min_gz, max_gz do
local n = math_sin(cx * 127.1 + cz * 311.7 + 8741.3) * 43758.5453
local rx = (n - math_floor(n)) * 0.6 + 0.2
local n2 = math_sin(cx * 269.5 + cz * 183.3 + 4521.7) * 43758.5453
local rz = (n2 - math_floor(n2)) * 0.6 + 0.2
num_pts = num_pts + 1
points_x[num_pts] = (cx + rx) * cell_size
points_z[num_pts] = (cz + rz) * cell_size
end
end
local heatmap = core.get_mapgen_object('heatmap')
for z = minp.z, maxp.z do
local col_z_offset = (z - minp.z) * chunk_size_x
for x = minp.x, maxp.x do
local col_idx = col_z_offset + (x - minp.x) + 1
-- Veins only generate in the opposite noise spectrum where crystal grass does not grow
if not grass_noise_buf[col_idx] or grass_noise_buf[col_idx] <= 0 then
-- Fast Worley F1/F2 distance from precomputed feature points
local min1_sq = 1e9
local min2_sq = 1e9
for i = 1, num_pts do
local dx = x - points_x[i]
local dz = z - points_z[i]
local dist_sq = dx * dx + dz * dz
if dist_sq < min1_sq then
min2_sq = min1_sq
min1_sq = dist_sq
elseif dist_sq < min2_sq then
min2_sq = dist_sq
end
end
local edge_dist = math_sqrt(min2_sq) - math_sqrt(min1_sq)
-- Crystals generate along the white Worley cell boundary veins
if edge_dist <= max_edge_dist then
-- Density gradient: concentration at vein center (~25%), smoothly thinning outward (~4%)
local t = edge_dist / max_edge_dist
local spawn_chance = 0.25 * ((1.0 - t) ^ 1.1)
local pos_rnd = (math_sin(x * 374.1 + z * 513.7 + 8741.3) * 43758.5453) % 1.0
if pos_rnd < spawn_chance then
local vi = area:index(x, maxp.y - 9, z)
for y = maxp.y - 9, minp.y, -1 do
if data[vi] == c_dirt_with_crystal_grass then
local vi_up1 = vi + ystride
if is_replaceable[data[vi_up1]] then
local rot = (x * 7 + z * 13) % 4
local heat = get_heat_at(x, z, col_idx, heatmap)
local pal_idx = get_crystal_palette_index(heat, x, z)
if edge_dist <= 8.0 then
-- Tier 1 (Center Spine): 9-tall Megaliths
place_megalith(data, p2data, vi, ystride, 9, pal_idx, rot)
elseif edge_dist <= 18.0 then
-- Tier 2: 7-tall Megaliths
place_megalith(data, p2data, vi, ystride, 7, pal_idx, rot)
elseif edge_dist <= 30.0 then
-- Tier 3: 5-tall Megaliths
place_megalith(data, p2data, vi, ystride, 5, pal_idx, rot)
elseif edge_dist <= 46.0 then
-- Tier 4: 3-tall Spires
place_megalith(data, p2data, vi, ystride, 3, pal_idx, rot)
else
-- Tier 5 (Outer Spread): 1-tall Glass Crystal Clusters
data[vi + ystride * 1] = c_cluster
p2data[vi + ystride * 1] = pal_idx * 32 + rot
end
end
break
end
vi = vi - ystride
end
end
end
end
end
end
end,
after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args)
local sidelength = maxp.x - minp.x + 1
local center_x = minp.x + math_floor(sidelength / 2) + rand:next(0, disp)
local center_z = minp.z + math_floor(sidelength / 2) + rand:next(0, disp)
local vi = area:index(center_x, minp.y, center_z)
local ystride = area.ystride
shared_args.schem_positions = {}
for y = minp.y, maxp.y do
if data[vi + ystride] == core.CONTENT_AIR
and data[vi] == c_dirt_with_crystal_grass
and rand:next(0, 100) < chance
then
local s_pos = area:position(vi)
--
-- Quartz Temple
--
-- add Y displacement
local schem_pos = vector.new(s_pos.x, s_pos.y - y_dis, s_pos.z)
-- find floor big enough
local positions = core.find_nodes_in_area_under_air(
vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z),
{
'everness:dirt_with_crystal_grass'
}
)
if #positions >= math_floor((size.x * size.z) * 0.7) then
-- enough air to place structure ?
local air_positions = core.find_nodes_in_area(
vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z),
{
'air'
}
)
if #air_positions > (size.x * size.y * size.z) / 2 then
core.place_schematic_on_vmanip(
vm,
schem_pos,
schem,
'random',
nil,
true,
'place_center_x, place_center_z'
)
shared_args.schem_positions.everness_quartz_temple = shared_args.schem_positions.everness_quartz_temple or {}
table.insert(shared_args.schem_positions.everness_quartz_temple, {
pos = schem_pos,
minp = vector.new(s_pos.x - size_x, s_pos.y - y_dis, s_pos.z - size_z),
maxp = vector.new(s_pos.x + size_x, s_pos.y - y_dis + size.y, s_pos.z + size_z)
})
core.log('action', '[Everness] Quartz Temple was placed at ' .. schem_pos:to_string())
break
end
end
end
vi = vi + ystride
end
end,
after_write_to_map = function(shared_args)
local schem_positions = shared_args.schem_positions or {}
for name, tbl in pairs(schem_positions) do
if next(tbl) then
for i, v in ipairs(tbl) do
local chest_positions = core.find_nodes_in_area(
v.minp,
v.maxp,
{ 'everness:chest' }
)
if #chest_positions > 0 then
Everness:populate_loot_chests(chest_positions)
end
end
end
end
end
})
@@ -0,0 +1,317 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--
-- Register biomes
--
local y_max = Everness.settings.biomes.everness_crystal_forest_deep_ocean.y_max
local y_min = Everness.settings.biomes.everness_crystal_forest_deep_ocean.y_min
-- Coral Forest Ocean
Everness:register_biome({
name = 'everness:crystal_forest_deep_ocean',
node_top = 'everness:crystal_forest_deep_ocean_sand',
depth_top = 1,
node_filler = 'everness:crystal_forest_deep_ocean_sand',
depth_filler = 3,
node_riverbed = 'everness:crystal_forest_deep_ocean_sand',
depth_riverbed = 2,
node_cave_liquid = 'mapgen_water_source',
node_dungeon = 'everness:crystal_forest_deep_ocean_sandstone_block',
node_dungeon_alt = 'everness:crystal_forest_deep_ocean_sandstone_brick',
node_dungeon_stair = 'stairs:stair_crystal_forest_deep_ocean_sandstone_block',
y_max = y_max,
y_min = y_min,
heat_point = 35,
humidity_point = 50,
})
--
-- Register decorations
--
Everness:register_decoration({
name = 'everness:crystal_forest_deep_ocean_coral_1',
deco_type = 'schematic',
place_on = { 'everness:crystal_forest_deep_ocean_sand' },
spawn_by = 'mapgen_water_source',
num_spawn_by = 8,
sidelen = 16,
fill_ratio = 0.003,
biomes = { 'everness:crystal_forest_deep_ocean' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_crystal_forest_deep_ocean_coral_1.mts',
flags = 'place_center_x, place_center_z, force_placement',
})
Everness:register_decoration({
name = 'everness:crystal_forest_deep_ocean_coral_2',
deco_type = 'schematic',
place_on = { 'everness:crystal_forest_deep_ocean_sand' },
spawn_by = 'mapgen_water_source',
num_spawn_by = 8,
sidelen = 16,
fill_ratio = 0.003,
biomes = { 'everness:crystal_forest_deep_ocean' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_crystal_forest_deep_ocean_coral_2.mts',
flags = 'place_center_x, place_center_z, force_placement',
})
Everness:register_decoration({
name = 'everness:crystal_forest_deep_ocean_coral_3',
deco_type = 'schematic',
place_on = { 'everness:crystal_forest_deep_ocean_sand' },
spawn_by = 'mapgen_water_source',
num_spawn_by = 8,
sidelen = 16,
fill_ratio = 0.003,
biomes = { 'everness:crystal_forest_deep_ocean' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_crystal_forest_deep_ocean_coral_3.mts',
flags = 'place_center_x, place_center_z, force_placement',
})
Everness:register_decoration({
name = 'everness:crystal_forest_deep_ocean_sand_with_crack',
deco_type = 'simple',
place_on = { 'everness:crystal_forest_deep_ocean_sand' },
place_offset_y = -1,
sidelen = 4,
fill_ratio = 0.002,
biomes = { 'everness:crystal_forest_deep_ocean' },
y_max = y_max,
y_min = y_min,
flags = 'force_placement',
decoration = { 'everness:crystal_forest_deep_ocean_sand_with_crack' },
spawn_by = 'mapgen_water_source',
num_spawn_by = 8,
})
Everness:register_decoration({
name = 'everness:crystal_forest_deep_ocean_coral_plant_1',
deco_type = 'simple',
place_on = { 'everness:crystal_forest_deep_ocean_sand' },
place_offset_y = -1,
sidelen = 4,
noise_params = {
offset = 0,
scale = 0.02,
spread = { x = 200, y = 200, z = 200 },
seed = 329,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:crystal_forest_deep_ocean' },
y_max = y_max,
y_min = y_min,
flags = 'force_placement',
decoration = { 'everness:crystal_forest_deep_ocean_coral_plant_1' },
spawn_by = 'mapgen_water_source',
num_spawn_by = 8,
})
Everness:register_decoration({
name = 'everness:crystal_forest_deep_ocean_coral_plant_2',
deco_type = 'simple',
place_on = { 'everness:crystal_forest_deep_ocean_sand' },
place_offset_y = -1,
sidelen = 4,
noise_params = {
offset = -0.02,
scale = 0.04,
spread = { x = 200, y = 200, z = 200 },
seed = 436,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:crystal_forest_deep_ocean' },
y_max = y_max,
y_min = y_min,
flags = 'force_placement',
decoration = { 'everness:crystal_forest_deep_ocean_coral_plant_2' },
spawn_by = 'mapgen_water_source',
num_spawn_by = 8,
})
Everness:register_decoration({
name = 'everness:crystal_forest_deep_ocean_coral_plant_3',
deco_type = 'simple',
place_on = { 'everness:crystal_forest_deep_ocean_sand' },
place_offset_y = -1,
sidelen = 4,
noise_params = {
offset = -0.02,
scale = 0.04,
spread = { x = 200, y = 200, z = 200 },
seed = 19822,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:crystal_forest_deep_ocean' },
y_max = y_max,
y_min = y_min,
flags = 'force_placement',
decoration = { 'everness:crystal_forest_deep_ocean_coral_plant_3' },
spawn_by = 'mapgen_water_source',
num_spawn_by = 8,
})
--
-- On Generated
--
local c_water_source = core.get_content_id('mapgen_water_source')
local c_everness_crystal_forest_deep_ocean_sand = core.get_content_id('everness:crystal_forest_deep_ocean_sand')
local c_everness_crystal_forest_deep_ocean_coral_plant_1 = core.get_content_id('everness:crystal_forest_deep_ocean_coral_plant_1')
local c_everness_crystal_forest_deep_ocean_coral_plant_2 = core.get_content_id('everness:crystal_forest_deep_ocean_coral_plant_2')
local c_everness_crystal_forest_deep_ocean_coral_plant_3 = core.get_content_id('everness:crystal_forest_deep_ocean_coral_plant_3')
local c_everness_crystal_forest_deep_ocean_coral_1 = core.get_content_id('everness:crystal_forest_deep_ocean_coral_1')
local c_everness_crystal_forest_deep_ocean_coral_2 = core.get_content_id('everness:crystal_forest_deep_ocean_coral_2')
local c_everness_crystal_forest_deep_ocean_coral_3 = core.get_content_id('everness:crystal_forest_deep_ocean_coral_3')
-- Biome IDs
local biome_id_everness_crystal_forest_deep_ocean = core.get_biome_id('everness:crystal_forest_deep_ocean')
local chance = 30
local schem = core.get_modpath('everness') .. '/schematics/everness_crystal_forest_deep_ocean_ruins.mts'
local size = { x = 14, y = 12, z = 9 }
local size_x = math.round(size.x / 2)
local size_z = math.round(size.z / 2)
Everness:add_to_queue_on_generated({
name = 'everness:crystal_forest_deep_ocean',
can_run = function(biomemap, chunk_biomes)
return (chunk_biomes and chunk_biomes[biome_id_everness_crystal_forest_deep_ocean]) or table.indexof(biomemap, biome_id_everness_crystal_forest_deep_ocean) ~= -1
end,
after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args)
shared_args.schem_positions = {}
local schem_placed = false
if rand:next(0, 100) < chance then
for y = maxp.y, minp.y, -1 do
if schem_placed then
break
end
for z = minp.z, maxp.z do
if schem_placed then
break
end
for x = minp.x, maxp.x do
local vi = area:index(x, y, z)
if
data[vi] == c_everness_crystal_forest_deep_ocean_sand
and data[vi + area.ystride] == c_water_source
then
local s_pos = area:position(vi)
--
-- Crystal Forest Deep Ocean Ruins
--
local schem_pos = vector.new(s_pos)
-- find floor big enough
local indexes = Everness.find_content_in_vm_area(
vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z),
{
c_everness_crystal_forest_deep_ocean_sand,
c_everness_crystal_forest_deep_ocean_coral_plant_1,
c_everness_crystal_forest_deep_ocean_coral_plant_2,
c_everness_crystal_forest_deep_ocean_coral_plant_3,
c_everness_crystal_forest_deep_ocean_coral_1,
c_everness_crystal_forest_deep_ocean_coral_2,
c_everness_crystal_forest_deep_ocean_coral_3
},
data,
area
)
if #indexes < size.x * size.z then
-- not enough space
return
end
-- enough water to place structure ?
local water_indexes = Everness.find_content_in_vm_area(
vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z),
{
c_water_source
},
data,
area
)
if #water_indexes > (size.x * size.y * size.z) / 2 then
core.place_schematic_on_vmanip(
vm,
schem_pos,
schem,
'random',
nil,
true,
'place_center_x, place_center_z'
)
schem_placed = true
shared_args.schem_positions.everness_crystal_forest_deep_ocean_ruins = shared_args.schem_positions.everness_crystal_forest_deep_ocean_ruins or {}
table.insert(shared_args.schem_positions.everness_crystal_forest_deep_ocean_ruins, {
pos = schem_pos,
minp = vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z),
maxp = vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z)
})
core.log('action', '[Everness] Crystal Forest Deep Ocean Ruins was placed at ' .. schem_pos:to_string())
break
end
end
end
end
end
end
end,
after_write_to_map = function(shared_args)
local schem_positions = shared_args.schem_positions or {}
for name, tbl in pairs(schem_positions) do
if next(tbl) then
for i, v in ipairs(tbl) do
local chest_positions = core.find_nodes_in_area(
v.minp,
v.maxp,
{ 'everness:chest' }
)
if #chest_positions > 0 then
Everness:populate_loot_chests(chest_positions)
end
end
end
end
end
})
@@ -0,0 +1,337 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--
-- Register biomes
--
local y_max = Everness.settings.biomes.everness_crystal_forest_dunes.y_max
local y_min = Everness.settings.biomes.everness_crystal_forest_dunes.y_min
-- Crystal Forest Dunes
Everness:register_biome({
name = 'everness:crystal_forest_dunes',
node_top = 'everness:crystal_sand',
depth_top = 1,
node_filler = 'everness:crystal_sand',
depth_filler = 3,
node_riverbed = 'everness:crystal_sand',
depth_riverbed = 2,
node_stone = 'everness:crystal_stone',
node_dungeon = 'everness:crystal_cobble',
node_dungeon_alt = 'everness:crystal_mossy_cobble',
node_dungeon_stair = 'stairs:stair_crystal_cobble',
vertical_blend = 1,
y_max = y_max,
y_min = y_min,
heat_point = 35,
humidity_point = 50,
})
--
-- Register ores
--
-- Blob ore.
-- These before scatter ores to avoid other ores in blobs.
-- Crystal sand
Everness:register_ore({
ore_type = 'blob',
ore = 'everness:crystal_sand',
wherein = { 'everness:crystal_stone' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = 2316,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:crystal_forest_dunes' }
})
-- Dirt
Everness:register_ore({
ore_type = 'blob',
ore = 'everness:crystal_dirt',
wherein = { 'everness:crystal_stone' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = 17676,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:crystal_forest_dunes' }
})
--
-- Register decorations
--
Everness:register_decoration({
name = 'everness:crystal_forest_dunes_ruins_1',
deco_type = 'schematic',
place_on = { 'everness:crystal_sand' },
sidelen = 16,
noise_params = {
offset = -0.0003,
scale = 0.0009,
spread = { x = 200, y = 200, z = 200 },
seed = 230,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:crystal_forest_dunes' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_crystal_forest_ruins_1.mts',
flags = 'place_center_x, place_center_z',
rotation = 'random',
})
Everness:register_decoration({
name = 'everness:crystal_forest_dunes_ruins_2',
deco_type = 'schematic',
place_on = { 'everness:crystal_sand' },
place_offset_y = 0,
sidelen = 16,
noise_params = {
offset = -0.0003,
scale = 0.0009,
spread = { x = 200, y = 200, z = 200 },
seed = 230,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:crystal_forest_dunes' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_crystal_forest_ruins_2.mts',
flags = 'place_center_x, place_center_z',
rotation = 'random',
})
--
-- On Generated
--
local chance = 20
local chance_water = 10
local disp = 16
local water_level = tonumber(core.settings:get('water_level')) or 1
local schem = core.read_schematic(core.get_modpath('everness') .. '/schematics/everness_quartz_fountain.mts', {})
local size = { x = 11, y = 10, z = 11 }
local size_x = math.round(size.x / 2)
local size_z = math.round(size.z / 2)
local y_dis = 1
local schem_shrine = core.read_schematic(core.get_modpath('everness') .. '/schematics/everness_crystal_forest_ocean_shrine.mts', {})
local size_shrine = { x = 13, y = 16, z = 13 }
local size_x_shrine = math.round(size.x / 2)
local size_z_shrine = math.round(size.z / 2)
local y_dis_shrine = 8
local c_everness_crystal_sand = core.get_content_id('everness:crystal_sand')
local c_water_source = core.get_content_id('mapgen_water_source')
local biome_id_everness_crystal_forest_dunes = core.get_biome_id('everness:crystal_forest_dunes')
Everness:add_to_queue_on_generated({
name = 'everness:crystal_forest_dunes',
can_run = function(biomemap, chunk_biomes)
return (chunk_biomes and chunk_biomes[biome_id_everness_crystal_forest_dunes]) or table.indexof(biomemap, biome_id_everness_crystal_forest_dunes) ~= -1
end,
after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args)
local sidelength = maxp.x - minp.x + 1
local x_disp = rand:next(0, disp)
local z_disp = rand:next(0, disp)
shared_args.schem_positions = {}
for y = minp.y, maxp.y do
local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp)
if data[vi + area.ystride] == core.CONTENT_AIR then
local s_pos = area:position(vi)
if
data[vi] == c_everness_crystal_sand
and rand:next(0, 100) < chance
then
--
-- Quartz Fountain
--
-- add Y displacement
local schem_pos = vector.new(s_pos.x, s_pos.y - y_dis, s_pos.z)
-- find floor big enough
local positions = core.find_nodes_in_area_under_air(
vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z),
{
'everness:crystal_sand'
}
)
if #positions < size.x * size.z then
-- not enough space
return
end
-- enough air to place structure ?
local air_positions = core.find_nodes_in_area(
vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z),
{
'air'
}
)
local replacements
if rand:next(0, 100) < 50 then
replacements = {
['everness:chest'] = 'everness:quartz_pillar'
}
end
if #air_positions > (size.x * size.y * size.z) / 2 then
core.place_schematic_on_vmanip(
vm,
schem_pos,
schem,
'random',
replacements,
true,
'place_center_x, place_center_z'
)
shared_args.schem_positions.everness_quartz_fountain = shared_args.schem_positions.everness_quartz_fountain or {}
table.insert(shared_args.schem_positions.everness_quartz_fountain, {
pos = schem_pos,
minp = vector.new(s_pos.x - size_x, s_pos.y - y_dis, s_pos.z - size_z),
maxp = vector.new(s_pos.x + size_x, s_pos.y - y_dis + size.y, s_pos.z + size_z)
})
core.log('action', '[Everness] Quartz Fountain was placed at ' .. schem_pos:to_string())
end
end
if data[vi] == c_water_source
and rand:next(0, 100) < chance_water
-- Water Level
and water_level >= minp.y
and water_level <= maxp.y
then
--
-- Crystal Forest Ocean Shrine
--
-- add Y displacement
local schem_pos = vector.new(s_pos.x, s_pos.y - y_dis_shrine, s_pos.z)
-- find floor big enough
local indexes = Everness.find_content_in_vm_area(
vector.new(s_pos.x - size_x_shrine, s_pos.y - 1, s_pos.z - size_z_shrine),
vector.new(s_pos.x + size_x_shrine, s_pos.y + 1, s_pos.z + size_z_shrine),
{
c_water_source,
core.CONTENT_AIR
},
data,
area
)
if #indexes < size_shrine.x * size_shrine.z then
-- not enough space
return
end
-- enough space to place structure ?
local space_indexes = Everness.find_content_in_vm_area(
vector.new(s_pos.x - size_x_shrine, s_pos.y, s_pos.z - size_z_shrine),
vector.new(s_pos.x + size_x_shrine, s_pos.y + size_shrine.y, s_pos.z + size_z_shrine),
{
c_water_source,
core.CONTENT_AIR
},
data,
area
)
if #space_indexes > (size_shrine.x * size_shrine.y * size_shrine.z) / 2 then
core.place_schematic_on_vmanip(
vm,
schem_pos,
schem_shrine,
'random',
nil,
true,
'place_center_x, place_center_z'
)
shared_args.schem_positions.everness_crystal_forest_ocean_shrine = shared_args.schem_positions.everness_crystal_forest_ocean_shrine or {}
table.insert(shared_args.schem_positions.everness_crystal_forest_ocean_shrine, {
pos = schem_pos,
minp = vector.new(s_pos.x - size_x_shrine, s_pos.y - y_dis_shrine, s_pos.z - size_z_shrine),
maxp = vector.new(s_pos.x + size_x_shrine, s_pos.y - y_dis_shrine + size_shrine.y, s_pos.z + size_z_shrine)
})
core.log('action', '[Everness] Crystal Forest Ocean Shrine was placed at ' .. schem_pos:to_string())
end
end
end
end
end,
after_write_to_map = function(shared_args)
local schem_positions = shared_args.schem_positions or {}
for name, tbl in pairs(schem_positions) do
if next(tbl) then
for i, v in ipairs(tbl) do
local chest_positions = core.find_nodes_in_area(
v.minp,
v.maxp,
{ 'everness:chest' }
)
if #chest_positions > 0 then
Everness:populate_loot_chests(chest_positions)
end
end
end
end
end
})
@@ -0,0 +1,147 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--
-- Register biomes
--
local y_max = Everness.settings.biomes.everness_crystal_forest_ocean.y_max
local y_min = Everness.settings.biomes.everness_crystal_forest_ocean.y_min
-- Crystal Forest Ocean
Everness:register_biome({
name = 'everness:crystal_forest_ocean',
node_top = 'everness:crystal_sand',
depth_top = 1,
node_filler = 'everness:crystal_sand',
depth_filler = 3,
node_riverbed = 'everness:crystal_sand',
depth_riverbed = 2,
node_stone = 'everness:crystal_stone',
node_cave_liquid = 'mapgen_water_source',
node_dungeon = 'everness:crystal_cobble',
node_dungeon_alt = 'everness:crystal_mossy_cobble',
node_dungeon_stair = 'stairs:stair_crystal_cobble',
y_max = y_max,
y_min = y_min,
heat_point = 35,
humidity_point = 50,
})
--
-- Register ores
--
-- Blob ore.
-- These before scatter ores to avoid other ores in blobs.
-- Clay
Everness:register_ore({
ore_type = 'blob',
ore = 'default:clay',
wherein = { 'everness:crystal_sand' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = -316,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:crystal_forest_ocean' }
})
-- Crystal sand
Everness:register_ore({
ore_type = 'blob',
ore = 'everness:crystal_sand',
wherein = { 'everness:crystal_stone' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = 2316,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:crystal_forest_ocean' }
})
-- Dirt
Everness:register_ore({
ore_type = 'blob',
ore = 'everness:crystal_dirt',
wherein = { 'everness:crystal_stone' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = 17676,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:crystal_forest_ocean' }
})
--
-- Register decorations
--
-- Coral reef
Everness:register_decoration({
name = 'everness:crystal_forest_ocean_corals',
deco_type = 'simple',
place_on = { 'everness:crystal_sand' },
place_offset_y = -1,
sidelen = 4,
noise_params = {
offset = -4,
scale = 4,
spread = { x = 50, y = 50, z = 50 },
seed = 7013,
octaves = 3,
persist = 0.7,
},
biomes = { 'everness:crystal_forest_ocean' },
y_max = y_max,
y_min = y_max - 10 > y_min and y_max - 10 or y_min,
flags = 'force_placement',
decoration = {
'everness:crystal_coral_dark',
'everness:crystal_coral_light',
'everness:coral_skeleton'
},
})
@@ -0,0 +1,136 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--
-- Register biomes
--
local y_max = Everness.settings.biomes.everness_crystal_forest_shore.y_max
local y_min = Everness.settings.biomes.everness_crystal_forest_shore.y_min
-- Crystal Forest Shore
Everness:register_biome({
name = 'everness:crystal_forest_shore',
node_top = 'everness:crystal_sand',
depth_top = 1,
node_filler = 'everness:crystal_sand',
depth_filler = 3,
node_riverbed = 'everness:crystal_sand',
depth_riverbed = 2,
node_stone = 'everness:crystal_stone',
node_cave_liquid = 'mapgen_water_source',
node_dungeon = 'everness:crystal_cobble',
node_dungeon_alt = 'everness:crystal_mossy_cobble',
node_dungeon_stair = 'stairs:stair_crystal_cobble',
y_max = y_max,
y_min = y_min,
heat_point = 35,
humidity_point = 50,
})
--
-- Register ores
--
-- Blob ore.
-- These before scatter ores to avoid other ores in blobs.
-- Crystal sand
Everness:register_ore({
ore_type = 'blob',
ore = 'everness:crystal_sand',
wherein = { 'everness:crystal_stone' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = 2316,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:crystal_forest_shore' }
})
-- Dirt
Everness:register_ore({
ore_type = 'blob',
ore = 'everness:crystal_dirt',
wherein = { 'everness:crystal_stone' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = 17676,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:crystal_forest_shore' }
})
-- Scatter ores
-- Coal
Everness:register_ore({
ore_type = 'scatter',
ore = 'everness:crystal_stone_with_coal',
wherein = 'everness:crystal_stone',
clust_scarcity = 8 * 8 * 8,
clust_num_ores = 9,
clust_size = 3,
y_max = y_max,
y_min = y_min,
biomes = { 'everness:crystal_forest_shore' }
})
--
-- Register decorations
--
Everness:register_decoration({
name = 'everness:crystal_forest_shore_crystal_waterlily',
deco_type = 'simple',
place_on = { 'everness:crystal_sand' },
sidelen = 16,
noise_params = {
offset = -0.12,
scale = 0.3,
spread = { x = 200, y = 200, z = 200 },
seed = 33,
octaves = 3,
persist = 0.7
},
biomes = { 'everness:crystal_forest_shore' },
y_max = y_max,
y_min = y_max,
decoration = 'everness:crystal_waterlily',
param2 = 0,
param2_max = 3,
place_offset_y = 1,
})
@@ -0,0 +1,446 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--
-- Register biomes
--
local y_max = Everness.settings.biomes.everness_crystal_forest_under.y_max
local y_min = Everness.settings.biomes.everness_crystal_forest_under.y_min
-- Crystal Forest Under
Everness:register_biome({
name = 'everness:crystal_forest_under',
node_cave_liquid = { 'mapgen_water_source', 'mapgen_lava_source' },
node_dungeon = 'everness:crystal_cobble',
node_dungeon_alt = 'everness:crystal_mossy_cobble',
node_dungeon_stair = 'stairs:stair_crystal_cobble',
y_max = y_max,
y_min = y_min,
heat_point = 35,
humidity_point = 50,
})
--
-- Register decorations
--
Everness:register_decoration({
name = 'everness:crystal_forest_under_floors',
deco_type = 'simple',
place_on = { 'default:stone' },
sidelen = 16,
place_offset_y = -1,
fill_ratio = 10,
biomes = { 'everness:crystal_forest_under' },
y_max = y_max,
y_min = y_min,
decoration = {
'everness:crystal_cave_dirt_with_moss',
'everness:crystal_moss_block'
},
flags = 'all_floors, force_placement'
})
Everness:register_decoration({
name = 'everness:crystal_forest_under_ceilings',
deco_type = 'simple',
place_on = { 'default:stone' },
sidelen = 16,
fill_ratio = 0.4,
biomes = { 'everness:crystal_forest_under' },
y_max = y_max,
y_min = y_min,
flags = 'all_ceilings',
decoration = {
'everness:crystal_moss_block'
},
})
Everness:register_decoration({
name = 'everness:crystal_forest_under_vines',
deco_type = 'simple',
place_on = { 'everness:crystal_moss_block' },
sidelen = 16,
fill_ratio = 0.09,
biomes = { 'everness:crystal_forest_under' },
param2 = 8,
decoration = {
'everness:twisted_vine_1',
'everness:twisted_vine_2',
'everness:golden_vine_1',
'everness:golden_vine_2'
},
y_max = y_max,
y_min = y_min,
flags = 'all_ceilings',
spawn_by = 'air',
num_spawn_by = 8
})
Everness:register_decoration({
name = 'everness:crystal_forest_under_crystal_sphere_cluster',
deco_type = 'simple',
place_on = {
'everness:crystal_cave_dirt_with_moss',
'everness:crystal_moss_block'
},
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.0005,
spread = { x = 250, y = 250, z = 250 },
seed = 2,
octaves = 3,
persist = 0.66
},
biomes = { 'everness:crystal_forest_under' },
y_max = y_max - 1500 > y_min and y_max - 1500 or y_max,
y_min = y_min,
flags = 'all_floors',
decoration = {
'everness:marker'
},
})
Everness:register_decoration({
name = 'everness:crystal_forest_under_crystal_cyan',
deco_type = 'simple',
place_on = {
'everness:crystal_cave_dirt_with_moss',
'everness:crystal_moss_block'
},
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.02,
spread = { x = 200, y = 200, z = 200 },
seed = 329,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:crystal_forest_under' },
y_max = y_max,
y_min = y_min,
decoration = {
'everness:crystal_cyan',
'everness:crystal_purple',
'everness:crystal_orange'
},
flags = 'all_floors',
param2 = 1
})
Everness:register_decoration({
name = 'everness:crystal_forest_under_twisted_crystal_grass',
deco_type = 'simple',
place_on = {
'everness:crystal_cave_dirt_with_moss',
'everness:crystal_moss_block'
},
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.2,
spread = { x = 100, y = 100, z = 100 },
seed = 801,
octaves = 3,
persist = 0.7
},
biomes = { 'everness:crystal_forest_under' },
y_max = y_max - 500 > y_min and y_max - 500 or y_max,
y_min = y_min,
decoration = 'everness:twisted_crystal_grass',
flags = 'all_floors',
param2 = 0,
param2_max = 239,
})
Everness:register_decoration({
name = 'everness:crystal_forest_under_twisted_crystal_spire',
deco_type = 'simple',
place_on = {
'everness:crystal_cave_dirt_with_moss',
'everness:crystal_moss_block'
},
sidelen = 16,
noise_params = {
offset = -0.05,
scale = 0.1,
spread = { x = 100, y = 100, z = 100 },
seed = 801,
octaves = 3,
persist = 0.7
},
biomes = { 'everness:crystal_forest_under' },
y_max = y_max - 500 > y_min and y_max - 500 or y_max,
y_min = y_min,
decoration = 'everness:twisted_crystal_spire',
flags = 'all_floors',
param2 = 0,
param2_max = 239,
})
Everness:register_decoration({
name = 'everness:crystal_forest_under_crystal_cyan_ceiling',
deco_type = 'simple',
place_on = { 'default:stone' },
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.02,
spread = { x = 200, y = 200, z = 200 },
seed = 329,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:crystal_forest_under' },
y_max = y_max,
y_min = y_min,
decoration = {
'everness:crystal_cyan',
'everness:crystal_purple',
'everness:crystal_orange'
},
flags = 'all_ceilings',
})
--
-- On Generated
--
local math_floor = math.floor
local math_sin = math.sin
local floor_nodes = {}
local function register_floor_node(name)
local id = core.get_content_id(name)
if id and id ~= core.CONTENT_IGNORE and id ~= core.CONTENT_AIR then
floor_nodes[id] = true
end
end
register_floor_node('everness:crystal_cave_dirt_with_moss')
register_floor_node('everness:crystal_moss_block')
local c_air = core.get_content_id('air')
local replaceable_nodes = {
[c_air] = true,
}
local function register_replaceable_node(name)
local id = core.get_content_id(name)
if id and id ~= core.CONTENT_IGNORE and id ~= core.CONTENT_AIR then
replaceable_nodes[id] = true
end
end
register_replaceable_node('everness:twisted_crystal_grass')
register_replaceable_node('everness:twisted_crystal_spire')
register_replaceable_node('everness:crystal_cyan')
register_replaceable_node('everness:crystal_purple')
register_replaceable_node('everness:crystal_orange')
local biome_id_everness_crystal_forest_under = core.get_biome_id('everness:crystal_forest_under')
local deco_id_crystal_forest_under_crystal_sphere_cluster = core.get_decoration_id('everness:crystal_forest_under_crystal_sphere_cluster')
-- `core.read_schematic` here so we don't cache the schem file, otherwise `replacements` will not work
local schem_crystal_sphere_cluster = core.read_schematic(core.get_modpath('everness') .. '/schematics/everness_crystal_purple_cluster.mts', {})
local crystal_sphere_cluster_size = { x = 20, y = 19, z = 19 }
local crystal_sphere_cluster_size_x = math.round(crystal_sphere_cluster_size.x / 2)
local crystal_sphere_cluster_size_z = math.round(crystal_sphere_cluster_size.z / 2)
local crystal_sphere_cluster_safe_volume = (crystal_sphere_cluster_size.x * crystal_sphere_cluster_size.y * crystal_sphere_cluster_size.z) / 2
local crystal_sphere_cluster_place_on = Everness.to_set(core.registered_decorations['everness:crystal_forest_under_crystal_sphere_cluster'].place_on)
Everness:register_gen_notify_decoration({
deco_id_crystal_forest_under_crystal_sphere_cluster
})
Everness:add_to_queue_on_generated({
name = 'everness:crystal_forest_under',
can_run = function(biomemap, chunk_biomes)
return (chunk_biomes and chunk_biomes[biome_id_everness_crystal_forest_under]) or table.indexof(biomemap, biome_id_everness_crystal_forest_under) ~= -1
end,
-- 1. on_data: Raw VoxelManip content/param2 manipulation (committed automatically via set_data)
on_data = function(minp, maxp, area, data, p2data, gennotify, rand, shared_args, biomemap)
--
-- Crystal Clusters (Marker-free Worley Cellular Noise L-System)
--
local cell_size = 32
local min_gx = math_floor(minp.x / cell_size) - 1
local max_gx = math_floor(maxp.x / cell_size) + 1
local min_gz = math_floor(minp.z / cell_size) - 1
local max_gz = math_floor(maxp.z / cell_size) + 1
local ystride = area.ystride
local chunk_size_x = maxp.x - minp.x + 1
for cx = min_gx, max_gx do
for cz = min_gz, max_gz do
local n = math_sin(cx * 127.1 + cz * 311.7 + 5432.1) * 43758.5453
local rand_val = (n - math_floor(n))
-- 80% chance cell has a crystal cluster, 20% empty spacing
if rand_val < 0.80 then
local n2 = math_sin(cx * 269.5 + cz * 183.3 + 9876.5) * 43758.5453
local rx = (n2 - math_floor(n2)) * 0.7 + 0.15
local n3 = math_sin(cx * 419.2 + cz * 371.9 + 1357.9) * 43758.5453
local rz = (n3 - math_floor(n3)) * 0.7 + 0.15
local seed_x = math_floor((cx + rx) * cell_size)
local seed_z = math_floor((cz + rz) * cell_size)
if seed_x >= minp.x and seed_x <= maxp.x and seed_z >= minp.z and seed_z <= maxp.z then
-- Check column biome
local col_idx = (seed_z - minp.z) * chunk_size_x + (seed_x - minp.x) + 1
if not biomemap or not biomemap[col_idx] or biomemap[col_idx] == biome_id_everness_crystal_forest_under then
-- Color zoning (Orange 45%, Cyan 30%, Purple 25%)
local color_choice = math_floor((rand_val / 0.80) * 3) % 3
local rand_color = (color_choice == 0 and 'orange') or (color_choice == 1 and 'cyan') or 'purple'
-- Scan vertical column for cavern floor surface
for y = maxp.y - 1, minp.y, -1 do
local vi = area:index(seed_x, y, seed_z)
local node_id = data[vi]
local above_id = data[vi + ystride]
if floor_nodes[node_id] and replaceable_nodes[above_id] then
-- Check vertical clearance (counting air and replaceable grass/decorations)
local clearance = 0
for h = 1, 12 do
local check_y = y + h
if check_y <= maxp.y and replaceable_nodes[data[vi + h * ystride]] then
clearance = clearance + 1
else
break
end
end
if clearance >= 2 then
local stage = 1
if clearance >= 9 and rand_val < 0.25 then
stage = 3 -- Grand Cavern Spire
elseif clearance >= 5 and rand_val < 0.55 then
stage = 2 -- Medium Cluster
end
local cluster_pos = vector.new(seed_x, y + 1, seed_z)
Everness.spawn_crystal_cluster_vmanip(
nil,
area,
data,
p2data,
cluster_pos,
rand_color,
stage,
rand
)
end
break -- Placed at highest valid floor in this column
end
end
end
end
end
end
end
end,
-- 2. after_set_data: Schematics placement on VoxelManip
after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args)
--
-- Crystal Sphere Cluster
--
for _, pos in ipairs(gennotify['decoration#' .. (deco_id_crystal_forest_under_crystal_sphere_cluster or '')] or {}) do
-- `pos` is position of the 'place_on' node
local marker_pos = vector.new(pos.x, pos.y + 1, pos.z)
local marker_node = core.get_node(marker_pos)
local place_on_node = core.get_node(pos)
local crystal_sphere_cluster_y_dis = rand:next(5, 9)
if marker_node and marker_node.name == 'everness:marker' then
-- remove marker
core.remove_node(marker_pos)
if place_on_node and crystal_sphere_cluster_place_on[place_on_node.name] then
-- enough air to place structure ?
local positions = core.find_nodes_in_area(
vector.new(
pos.x - crystal_sphere_cluster_size_x,
pos.y - crystal_sphere_cluster_y_dis,
pos.z - crystal_sphere_cluster_size_z
),
vector.new(
pos.x + crystal_sphere_cluster_size_x,
pos.y - crystal_sphere_cluster_y_dis + crystal_sphere_cluster_size.y,
pos.z + crystal_sphere_cluster_size_z
),
{
'air',
'everness:coral_tree',
'everness:crystal_block_orange',
'everness:crystal_block_purple',
'everness:crystal_block_cyan',
},
true
)
local air = positions.air or {}
local tree = positions['everness:coral_tree'] or {}
local block_orange = positions['everness:crystal_block_orange'] or {}
local block_purple = positions['everness:crystal_block_purple'] or {}
local block_cyan = positions['everness:crystal_block_cyan'] or {}
if
#air > crystal_sphere_cluster_safe_volume
-- do not overlap
and not (
#tree > 0
or #block_orange > 0
or #block_purple > 0
or #block_cyan > 0
)
then
local replacements
local rand_color
if rand:next(0, 100) < 25 then
local colors = { 'orange', 'cyan' }
rand_color = colors[rand:next(1, #colors)]
replacements = {
['everness:crystal_block_purple'] = 'everness:crystal_block_' .. rand_color,
['everness:crystal_purple'] = 'everness:crystal_' .. rand_color
}
end
core.place_schematic_on_vmanip(
vm,
vector.new(marker_pos.x, marker_pos.y - crystal_sphere_cluster_y_dis, marker_pos.z),
schem_crystal_sphere_cluster,
'random',
replacements,
true,
'place_center_x, place_center_z'
)
-- core.log('action', '[Everness] Crystal Sphere Cluster ' .. (rand_color or 'orange') .. ' was placed at ' .. pos:to_string())
end
end
end
end
end
})
+454
View File
@@ -0,0 +1,454 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--
-- Register biomes
--
local y_max = Everness.settings.biomes.everness_cursed_lands.y_max
local y_min = Everness.settings.biomes.everness_cursed_lands.y_min
-- Cursed Lands
Everness:register_biome({
name = 'everness:cursed_lands',
node_top = 'everness:dirt_with_cursed_grass',
depth_top = 1,
node_filler = 'everness:cursed_dirt',
depth_filler = 1,
node_riverbed = 'everness:cursed_dirt',
depth_riverbed = 2,
node_stone = 'everness:cursed_stone_carved',
node_dungeon = 'everness:cursed_brick',
node_dungeon_alt = 'everness:cursed_brick_with_growth',
node_dungeon_stair = 'stairs:stair_cursed_brick',
y_max = y_max,
y_min = y_min,
heat_point = 45,
humidity_point = 85,
})
--
-- Register ores
--
-- Stratum ores.
-- These obviously first.
Everness:register_ore({
ore_type = 'stratum',
ore = 'everness:cursed_stone',
wherein = { 'everness:cursed_stone_carved' },
clust_scarcity = 1,
y_max = (y_max - y_max) + 46,
y_min = (y_max - y_max) + 4,
noise_params = {
offset = 28,
scale = 16,
spread = { x = 128, y = 128, z = 128 },
seed = 90122,
octaves = 1,
},
stratum_thickness = 4,
biomes = { 'everness:cursed_lands' },
})
Everness:register_ore({
ore_type = 'stratum',
ore = 'everness:cursed_stone',
wherein = { 'everness:cursed_stone_carved' },
clust_scarcity = 1,
y_max = (y_max - y_max) + 42,
y_min = (y_max - y_max) + 6,
noise_params = {
offset = 24,
scale = 16,
spread = { x = 128, y = 128, z = 128 },
seed = 90122,
octaves = 1,
},
stratum_thickness = 2,
biomes = { 'everness:cursed_lands' },
})
-- Blob ore.
-- These before scatter ores to avoid other ores in blobs.
-- Sand
Everness:register_ore({
ore_type = 'blob',
ore = 'everness:cursed_sand',
wherein = { 'everness:cursed_stone_carved' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = 2316,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:cursed_lands' }
})
-- Dirt
Everness:register_ore({
ore_type = 'blob',
ore = 'everness:cursed_dirt',
wherein = { 'everness:cursed_stone_carved' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = 766,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:cursed_lands' }
})
-- Mud
Everness:register_ore({
ore_type = 'blob',
ore = 'everness:cursed_mud',
wherein = { 'everness:cursed_stone_carved' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = 17676,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:cursed_lands' }
})
-- Scatter ores
-- Coal
Everness:register_ore({
ore_type = 'scatter',
ore = 'everness:cursed_stone_carved_with_coal',
wherein = 'everness:cursed_stone_carved',
clust_scarcity = 8 * 8 * 8,
clust_num_ores = 9,
clust_size = 3,
y_max = y_max,
y_min = y_min,
biomes = { 'everness:cursed_lands' }
})
--
-- Register decorations
--
Everness:register_decoration({
name = 'everness:cursed_lands_cemetery',
deco_type = 'schematic',
place_on = { 'everness:dirt_with_cursed_grass' },
sidelen = 8,
noise_params = {
offset = -0.0003,
scale = 0.0009,
spread = { x = 200, y = 200, z = 200 },
seed = 230,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:cursed_lands' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_cemetery.mts',
flags = 'place_center_x, place_center_z',
rotation = 'random',
})
Everness:register_decoration({
name = 'everness:cursed_lands_ruins_1',
deco_type = 'schematic',
place_on = { 'everness:dirt_with_cursed_grass' },
sidelen = 8,
noise_params = {
offset = -0.0003,
scale = 0.0009,
spread = { x = 200, y = 200, z = 200 },
seed = 230,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:cursed_lands' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_ruins_1.mts',
flags = 'place_center_x, place_center_z',
rotation = 'random',
})
local function register_red_castor_decoration(offset, scale, length)
Everness:register_decoration({
name = 'everness:cursed_lands_red_castor_' .. length,
deco_type = 'simple',
place_on = { 'everness:dirt_with_cursed_grass' },
sidelen = 16,
noise_params = {
offset = offset,
scale = scale,
spread = { x = 200, y = 200, z = 200 },
seed = 329,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:cursed_lands' },
y_max = y_max,
y_min = y_min,
decoration = 'everness:red_castor_' .. length,
param2 = 0,
param2_max = 239,
})
end
-- Red Castor Grasses
register_red_castor_decoration(-0.03, 0.09, 4)
register_red_castor_decoration(-0.015, 0.075, 3)
register_red_castor_decoration(0, 0.06, 2)
register_red_castor_decoration(0.015, 0.045, 1)
local function register_cursed_bone_decoration(bone_id, node_name, offset, param2_max)
Everness:register_decoration({
name = 'everness:cursed_lands_bones_' .. bone_id,
deco_type = 'simple',
place_on = { 'everness:dirt_with_cursed_grass' },
sidelen = 16,
noise_params = {
offset = offset,
scale = -0.02, -- Gentle item density inside each cluster
spread = { x = 200, y = 200, z = 200 }, -- Matched to red castor spread
seed = 329, -- Matched to red castor seed
octaves = 5, -- Extra octaves create high-frequency ripples inside the empty areas
persist = 0.6
},
biomes = { 'everness:cursed_lands' },
y_max = y_max,
y_min = y_min,
decoration = node_name,
param2 = 0,
param2_max = param2_max,
})
end
-- Cursed Bones (thresholds set so clusters appear throughout the empty non-castor areas)
register_cursed_bone_decoration('cursed_bone_1', 'everness:cursed_bone_1', -0.011, 255) -- colordegrotate
register_cursed_bone_decoration('cursed_bone_2', 'everness:cursed_bone_2', -0.009, 239) -- degrotate
register_cursed_bone_decoration('cursed_bone_3', 'everness:cursed_bone_3', -0.010, 239) -- degrotate
Everness:register_decoration({
name = 'everness:cursed_lands_cursed_mud',
deco_type = 'simple',
place_on = { 'everness:dirt_with_cursed_grass', 'everness:cursed_dirt', 'everness:cursed_sand' },
place_offset_y = -1,
sidelen = 4,
noise_params = {
offset = -4,
scale = 4,
spread = { x = 50, y = 50, z = 50 },
seed = 7013,
octaves = 3,
persist = 0.7,
},
biomes = { 'everness:cursed_lands' },
y_max = y_max,
y_min = y_min,
flags = 'force_placement',
decoration = { 'everness:cursed_mud' },
})
Everness:register_decoration({
name = 'everness:cursed_lands_dry_tree',
deco_type = 'schematic',
place_on = {
'everness:dirt_with_cursed_grass',
'everness:cursed_dirt',
'everness:cursed_sand',
'everness:cursed_stone'
},
place_offset_y = 0,
sidelen = 16,
noise_params = {
offset = 0.0015,
scale = 0.0021,
spread = { x = 250, y = 250, z = 250 },
seed = 2,
octaves = 3,
persist = 0.66
},
biomes = { 'everness:cursed_lands' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_dry_tree.mts',
flags = 'place_center_x, place_center_z',
rotation = 'random',
})
Everness:register_decoration({
name = 'everness:cursed_lands_cursed_bush',
deco_type = 'schematic',
place_on = { 'everness:dirt_with_cursed_grass' },
sidelen = 16,
place_offset_y = 1,
noise_params = {
offset = -0.004,
scale = 0.01,
spread = { x = 100, y = 100, z = 100 },
seed = 137,
octaves = 3,
persist = 0.7,
},
biomes = { 'everness:cursed_lands' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_cursed_bush.mts',
flags = 'place_center_x, place_center_z',
})
--
-- On Generated
--
local chance = 20
local disp = 16
local schem = core.get_modpath('everness') .. '/schematics/everness_haunted_house.mts'
local size = { x = 11, y = 22, z = 10 }
local size_x = math.round(size.x / 2)
local size_z = math.round(size.z / 2)
local y_dis = 1
local c_dirt_with_cursed_grass = core.get_content_id('everness:dirt_with_cursed_grass')
local biome_id_everness_cursed_lands = core.get_biome_id('everness:cursed_lands')
Everness:add_to_queue_on_generated({
name = 'everness:cursed_lands',
can_run = function(biomemap, chunk_biomes)
return (chunk_biomes and chunk_biomes[biome_id_everness_cursed_lands]) or table.indexof(biomemap, biome_id_everness_cursed_lands) ~= -1
end,
after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args)
local sidelength = maxp.x - minp.x + 1
local x_disp = rand:next(0, disp)
local z_disp = rand:next(0, disp)
shared_args.schem_positions = {}
for y = minp.y, maxp.y do
local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp)
if data[vi + area.ystride] == core.CONTENT_AIR
and data[vi] == c_dirt_with_cursed_grass
and rand:next(0, 100) < chance
then
local s_pos = area:position(vi)
--
-- Haunted House
--
-- add Y displacement
local schem_pos = vector.new(s_pos.x, s_pos.y - y_dis, s_pos.z)
-- find floor big enough
local positions = core.find_nodes_in_area_under_air(
vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z),
{
'everness:dirt_with_cursed_grass'
}
)
if #positions < size.x * size.z then
-- not enough space
return
end
-- enough air to place structure ?
local air_positions = core.find_nodes_in_area(
vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z),
{
'air'
}
)
if #air_positions > (size.x * size.y * size.z) / 2 then
core.place_schematic_on_vmanip(
vm,
schem_pos,
schem,
'random',
nil,
true,
'place_center_x, place_center_z'
)
shared_args.schem_positions.everness_haunted_house = shared_args.schem_positions.everness_haunted_house or {}
table.insert(shared_args.schem_positions.everness_haunted_house, {
pos = schem_pos,
minp = vector.new(s_pos.x - size_x, s_pos.y - y_dis, s_pos.z - size_z),
maxp = vector.new(s_pos.x + size_x, s_pos.y - y_dis + size.y, s_pos.z + size_z)
})
core.log('action', '[Everness] Haunted House was placed at ' .. schem_pos:to_string())
end
end
end
end,
after_write_to_map = function(shared_args)
local schem_positions = shared_args.schem_positions or {}
for name, tbl in pairs(schem_positions) do
if next(tbl) then
for i, v in ipairs(tbl) do
local chest_positions = core.find_nodes_in_area(
v.minp,
v.maxp,
{ 'everness:chest' }
)
if #chest_positions > 0 then
Everness:populate_loot_chests(chest_positions)
end
end
end
end
end
})
@@ -0,0 +1,317 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--
-- Register biomes
--
local y_max = Everness.settings.biomes.everness_cursed_lands_deep_ocean.y_max
local y_min = Everness.settings.biomes.everness_cursed_lands_deep_ocean.y_min
-- Cursed Lands Deep Ocean
Everness:register_biome({
name = 'everness:cursed_lands_deep_ocean',
node_top = 'everness:cursed_lands_deep_ocean_sand',
depth_top = 1,
node_filler = 'everness:cursed_lands_deep_ocean_sand',
depth_filler = 3,
node_riverbed = 'everness:cursed_lands_deep_ocean_sand',
depth_riverbed = 2,
node_cave_liquid = 'mapgen_water_source',
node_dungeon = 'everness:cursed_lands_deep_ocean_sandstone_block',
node_dungeon_alt = 'everness:cursed_lands_deep_ocean_sandstone_brick',
node_dungeon_stair = 'stairs:stair_cursed_lands_deep_ocean_sandstone_block',
y_max = y_max,
y_min = y_min,
heat_point = 45,
humidity_point = 85,
})
--
-- Register decorations
--
Everness:register_decoration({
name = 'everness:forsaken_lands_deep_ocean_coral_alcyonacea',
deco_type = 'schematic',
place_on = { 'everness:cursed_lands_deep_ocean_sand' },
spawn_by = 'mapgen_water_source',
num_spawn_by = 8,
sidelen = 16,
fill_ratio = 0.002,
biomes = { 'everness:cursed_lands_deep_ocean' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_forsaken_lands_deep_ocean_coral_alcyonacea.mts',
flags = 'place_center_x, place_center_z, force_placement',
})
Everness:register_decoration({
name = 'everness:forsaken_lands_deep_ocean_coral_ostracod',
deco_type = 'schematic',
place_on = { 'everness:cursed_lands_deep_ocean_sand' },
spawn_by = 'mapgen_water_source',
num_spawn_by = 8,
sidelen = 16,
fill_ratio = 0.002,
biomes = { 'everness:cursed_lands_deep_ocean' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_forsaken_lands_deep_ocean_coral_ostracod.mts',
flags = 'place_center_x, place_center_z, force_placement',
})
Everness:register_decoration({
name = 'everness:forsaken_lands_deep_ocean_coral_octocurse',
deco_type = 'schematic',
place_on = { 'everness:cursed_lands_deep_ocean_sand' },
spawn_by = 'mapgen_water_source',
num_spawn_by = 8,
sidelen = 16,
fill_ratio = 0.002,
biomes = { 'everness:cursed_lands_deep_ocean' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_forsaken_lands_deep_ocean_coral_octocurse.mts',
flags = 'place_center_x, place_center_z, force_placement',
})
Everness:register_decoration({
name = 'everness:cursed_lands_deep_ocean_mud',
deco_type = 'simple',
place_on = { 'everness:cursed_lands_deep_ocean_sand' },
place_offset_y = -1,
sidelen = 4,
fill_ratio = 0.002,
biomes = { 'everness:cursed_lands_deep_ocean' },
y_max = y_max,
y_min = y_min,
flags = 'force_placement',
decoration = { 'everness:cursed_lands_deep_ocean_sand_with_crack' },
spawn_by = 'mapgen_water_source',
num_spawn_by = 8,
})
Everness:register_decoration({
name = 'everness:cursed_lands_deep_ocean_plants_1',
deco_type = 'simple',
place_on = { 'everness:cursed_lands_deep_ocean_sand' },
place_offset_y = -1,
sidelen = 4,
noise_params = {
offset = 0,
scale = 0.02,
spread = { x = 200, y = 200, z = 200 },
seed = 329,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:cursed_lands_deep_ocean' },
y_max = y_max,
y_min = y_min,
flags = 'force_placement',
decoration = { 'everness:cursed_lands_deep_ocean_coral_plant_anemone' },
spawn_by = 'mapgen_water_source',
num_spawn_by = 8,
})
Everness:register_decoration({
name = 'everness:cursed_lands_deep_ocean_plants_2',
deco_type = 'simple',
place_on = { 'everness:cursed_lands_deep_ocean_sand' },
place_offset_y = -1,
sidelen = 4,
noise_params = {
offset = -0.02,
scale = 0.04,
spread = { x = 200, y = 200, z = 200 },
seed = 436,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:cursed_lands_deep_ocean' },
y_max = y_max,
y_min = y_min,
flags = 'force_placement',
decoration = { 'everness:cursed_lands_deep_ocean_coral_plant_darkilluma' },
spawn_by = 'mapgen_water_source',
num_spawn_by = 8,
})
Everness:register_decoration({
name = 'everness:cursed_lands_deep_ocean_plants_3',
deco_type = 'simple',
place_on = { 'everness:cursed_lands_deep_ocean_sand' },
place_offset_y = -1,
sidelen = 4,
noise_params = {
offset = -0.02,
scale = 0.04,
spread = { x = 200, y = 200, z = 200 },
seed = 19822,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:cursed_lands_deep_ocean' },
y_max = y_max,
y_min = y_min,
flags = 'force_placement',
decoration = { 'everness:cursed_lands_deep_ocean_coral_plant_demon' },
spawn_by = 'mapgen_water_source',
num_spawn_by = 8,
})
--
-- On Generated
--
local c_water_source = core.get_content_id('mapgen_water_source')
local c_everness_cursed_lands_deep_ocean_sand = core.get_content_id('everness:cursed_lands_deep_ocean_sand')
local c_everness_cursed_lands_deep_ocean_coral_plant_anemone = core.get_content_id('everness:cursed_lands_deep_ocean_coral_plant_anemone')
local c_everness_cursed_lands_deep_ocean_coral_plant_darkilluma = core.get_content_id('everness:cursed_lands_deep_ocean_coral_plant_darkilluma')
local c_everness_cursed_lands_deep_ocean_coral_plant_demon = core.get_content_id('everness:cursed_lands_deep_ocean_coral_plant_demon')
local c_everness_cursed_lands_deep_ocean_coral_alcyonacea = core.get_content_id('everness:cursed_lands_deep_ocean_coral_alcyonacea')
local c_everness_cursed_lands_deep_ocean_coral_ostracod = core.get_content_id('everness:cursed_lands_deep_ocean_coral_ostracod')
local c_everness_cursed_lands_deep_ocean_coral_octocurse = core.get_content_id('everness:cursed_lands_deep_ocean_coral_octocurse')
-- Biome IDs
local biome_id_everness_cursed_lands_deep_ocean = core.get_biome_id('everness:cursed_lands_deep_ocean')
local chance = 30
local schem = core.get_modpath('everness') .. '/schematics/everness_cursed_lands_deep_ocean_skull.mts'
local size = { x = 10, y = 11, z = 11 }
local size_x = math.round(size.x / 2)
local size_z = math.round(size.z / 2)
Everness:add_to_queue_on_generated({
name = 'everness:cursed_lands_deep_ocean',
can_run = function(biomemap, chunk_biomes)
return (chunk_biomes and chunk_biomes[biome_id_everness_cursed_lands_deep_ocean]) or table.indexof(biomemap, biome_id_everness_cursed_lands_deep_ocean) ~= -1
end,
after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args)
shared_args.schem_positions = {}
local schem_placed = false
if rand:next(0, 100) < chance then
for y = maxp.y, minp.y, -1 do
if schem_placed then
break
end
for z = minp.z, maxp.z do
if schem_placed then
break
end
for x = minp.x, maxp.x do
local vi = area:index(x, y, z)
if
data[vi] == c_everness_cursed_lands_deep_ocean_sand
and data[vi + area.ystride] == c_water_source
then
local s_pos = area:position(vi)
--
-- Cursed Lands Deep Ocean Skull
--
local schem_pos = vector.new(s_pos)
-- find floor big enough
local indexes = Everness.find_content_in_vm_area(
vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z),
{
c_everness_cursed_lands_deep_ocean_sand,
c_everness_cursed_lands_deep_ocean_coral_plant_anemone,
c_everness_cursed_lands_deep_ocean_coral_plant_darkilluma,
c_everness_cursed_lands_deep_ocean_coral_plant_demon,
c_everness_cursed_lands_deep_ocean_coral_alcyonacea,
c_everness_cursed_lands_deep_ocean_coral_ostracod,
c_everness_cursed_lands_deep_ocean_coral_octocurse
},
data,
area
)
if #indexes < size.x * size.z then
-- not enough space
return
end
-- enough water to place structure ?
local water_indexes = Everness.find_content_in_vm_area(
vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z),
{
c_water_source
},
data,
area
)
if #water_indexes > (size.x * size.y * size.z) / 2 then
core.place_schematic_on_vmanip(
vm,
schem_pos,
schem,
'random',
nil,
true,
'place_center_x, place_center_z'
)
schem_placed = true
shared_args.schem_positions.everness_cursed_lands_deep_ocean_skull = shared_args.schem_positions.everness_cursed_lands_deep_ocean_skull or {}
table.insert(shared_args.schem_positions.everness_cursed_lands_deep_ocean_skull, {
pos = schem_pos,
minp = vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z),
maxp = vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z)
})
core.log('action', '[Everness] Cursed Lands Deep Ocean Skull was placed at ' .. schem_pos:to_string())
break
end
end
end
end
end
end
end,
after_write_to_map = function(shared_args)
local schem_positions = shared_args.schem_positions or {}
for name, tbl in pairs(schem_positions) do
if next(tbl) then
for i, v in ipairs(tbl) do
local chest_positions = core.find_nodes_in_area(
v.minp,
v.maxp,
{ 'everness:chest' }
)
if #chest_positions > 0 then
Everness:populate_loot_chests(chest_positions)
end
end
end
end
end
})
+348
View File
@@ -0,0 +1,348 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--
-- Register biomes
--
local y_max = Everness.settings.biomes.everness_cursed_lands_dunes.y_max
local y_min = Everness.settings.biomes.everness_cursed_lands_dunes.y_min
-- Cursed Lands Dunes
Everness:register_biome({
name = 'everness:cursed_lands_dunes',
node_top = 'everness:cursed_sand',
depth_top = 1,
node_filler = 'everness:cursed_sand',
depth_filler = 3,
node_riverbed = 'everness:cursed_sand',
depth_riverbed = 2,
node_stone = 'everness:cursed_stone_carved',
node_dungeon = 'everness:cursed_sandstone_brick',
node_dungeon_alt = 'everness:cursed_sandstone_block',
node_dungeon_stair = 'stairs:stair_cursed_sandstone_brick',
vertical_blend = 1,
y_max = y_max,
y_min = y_min,
heat_point = 45,
humidity_point = 85,
})
--
-- Register ores
--
-- Blob ore.
-- These before scatter ores to avoid other ores in blobs.
-- Sand
Everness:register_ore({
ore_type = 'blob',
ore = 'everness:cursed_sand',
wherein = { 'everness:cursed_stone_carved' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = 2316,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:cursed_lands_dunes' }
})
-- Dirt
Everness:register_ore({
ore_type = 'blob',
ore = 'everness:cursed_dirt',
wherein = { 'everness:cursed_stone_carved' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = 766,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:cursed_lands_dunes' }
})
-- Mud
Everness:register_ore({
ore_type = 'blob',
ore = 'everness:cursed_mud',
wherein = { 'everness:cursed_stone_carved' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = 17676,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:cursed_lands_dunes' }
})
-- Scatter ores
-- Coal
Everness:register_ore({
ore_type = 'scatter',
ore = 'everness:cursed_stone_carved_with_coal',
wherein = 'everness:cursed_stone_carved',
clust_scarcity = 8 * 8 * 8,
clust_num_ores = 9,
clust_size = 3,
y_max = y_max,
y_min = y_min,
biomes = { 'everness:cursed_lands_dunes' }
})
--
-- Register decorations
--
Everness:register_decoration({
name = 'everness:cursed_lands_dunes_dry_tree',
deco_type = 'schematic',
place_on = {
'everness:dirt_with_cursed_grass',
'everness:cursed_dirt',
'everness:cursed_sand',
'everness:cursed_stone'
},
place_offset_y = 0,
sidelen = 16,
noise_params = {
offset = 0.0015,
scale = 0.0021,
spread = { x = 250, y = 250, z = 250 },
seed = 2,
octaves = 3,
persist = 0.66
},
biomes = { 'everness:cursed_lands_dunes' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_dry_tree.mts',
flags = 'place_center_x, place_center_z',
rotation = 'random',
})
--
-- On Generated
--
local chance = 30
local chance_water = 10
local disp = 16
local water_level = tonumber(core.settings:get('water_level')) or 1
local schem_cursed_cabin = core.get_modpath('everness') .. '/schematics/everness_cursed_cabin.mts'
local size = { x = 7, y = 7, z = 12 }
local size_x = math.round(size.x / 2)
local size_z = math.round(size.z / 2)
local schem_ocean_island = core.get_modpath('everness') .. '/schematics/everness_cursed_lands_deep_ocean_island.mts'
local size_ocean_island = { x = 25, y = 23, z = 23 }
local size_x_ocean_island = math.round(size.x / 2)
local size_z_ocean_island = math.round(size.z / 2)
local y_dis_ocean_island = 7
local c_cursed_sand = core.get_content_id('everness:cursed_sand')
local c_water_source = core.get_content_id('mapgen_water_source')
local biome_id_everness_cursed_lands_dunes = core.get_biome_id('everness:cursed_lands_dunes')
Everness:add_to_queue_on_generated({
name = 'everness:cursed_lands_dunes',
can_run = function(biomemap, chunk_biomes)
return (chunk_biomes and chunk_biomes[biome_id_everness_cursed_lands_dunes]) or table.indexof(biomemap, biome_id_everness_cursed_lands_dunes) ~= -1
end,
after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args)
local sidelength = maxp.x - minp.x + 1
local x_disp = rand:next(0, disp)
local z_disp = rand:next(0, disp)
shared_args.schem_positions = {}
for y = minp.y, maxp.y do
local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp)
if data[vi + area.ystride] == core.CONTENT_AIR then
local s_pos = area:position(vi)
if data[vi] == c_cursed_sand
and rand:next(0, 100) < chance
then
--
-- Cursed Cabin
--
-- add Y displacement
local schem_pos = vector.new(s_pos.x, s_pos.y, s_pos.z)
-- find floor big enough
local positions = core.find_nodes_in_area_under_air(
vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z),
{
'everness:cursed_sand'
}
)
if #positions < size.x * size.z then
-- not enough space
return
end
-- enough air to place structure ?
local air_positions = core.find_nodes_in_area(
vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z),
{
'air'
}
)
if #air_positions > (size.x * size.y * size.z) / 2 then
core.place_schematic_on_vmanip(
vm,
schem_pos,
schem_cursed_cabin,
'random',
nil,
true,
'place_center_x, place_center_z'
)
shared_args.schem_positions.everness_cursed_cabin = shared_args.schem_positions.everness_cursed_cabin or {}
table.insert(shared_args.schem_positions.everness_cursed_cabin, {
pos = schem_pos,
minp = vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z),
maxp = vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z)
})
core.log('action', '[Everness] Cursed Cabin was placed at ' .. schem_pos:to_string())
end
end
if data[vi] == c_water_source
and rand:next(0, 100) < chance_water
-- Water Level
and water_level >= minp.y
and water_level <= maxp.y
then
--
-- Cursed Lands Deep Ocean Island
--
local schem_pos = vector.new(s_pos.x, s_pos.y - y_dis_ocean_island, s_pos.z)
-- find floor big enough
local indexes = Everness.find_content_in_vm_area(
vector.new(s_pos.x - size_x_ocean_island, s_pos.y - 1, s_pos.z - size_z),
vector.new(s_pos.x + size_x_ocean_island, s_pos.y + 1, s_pos.z + size_z),
{
c_water_source,
core.CONTENT_AIR
},
data,
area
)
if #indexes < size_ocean_island.x * size_ocean_island.z then
-- not enough space
return
end
-- enough space to place structure ?
local space_indexes = Everness.find_content_in_vm_area(
vector.new(s_pos.x - size_x_ocean_island, s_pos.y, s_pos.z - size_z_ocean_island),
vector.new(s_pos.x + size_x_ocean_island, s_pos.y + size_ocean_island.y, s_pos.z + size_z_ocean_island),
{
c_water_source,
core.CONTENT_AIR
},
data,
area
)
if #space_indexes > (size_ocean_island.x * size_ocean_island.y * size_ocean_island.z) / 2 then
core.place_schematic_on_vmanip(
vm,
schem_pos,
schem_ocean_island,
'random',
nil,
true,
'place_center_x, place_center_z'
)
shared_args.schem_positions.everness_cursed_lands_deep_ocean_island = shared_args.schem_positions.everness_cursed_lands_deep_ocean_island or {}
table.insert(shared_args.schem_positions.everness_cursed_lands_deep_ocean_island, {
pos = schem_pos,
minp = vector.new(s_pos.x - size_x_ocean_island, s_pos.y - y_dis_ocean_island, s_pos.z - size_z_ocean_island),
maxp = vector.new(s_pos.x + size_x_ocean_island, s_pos.y - y_dis_ocean_island + size_ocean_island.y, s_pos.z + size_z_ocean_island)
})
core.log('action', '[Everness] Cursed Lands Deep Ocean Island was placed at ' .. schem_pos:to_string())
end
end
end
end
end,
after_write_to_map = function(shared_args)
local schem_positions = shared_args.schem_positions or {}
for name, tbl in pairs(schem_positions) do
if next(tbl) then
for i, v in ipairs(tbl) do
local chest_positions = core.find_nodes_in_area(
v.minp,
v.maxp,
{ 'everness:chest' }
)
if #chest_positions > 0 then
Everness:populate_loot_chests(chest_positions)
end
end
end
end
end
})
+213
View File
@@ -0,0 +1,213 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--
-- Register biomes
--
local y_max = Everness.settings.biomes.everness_cursed_lands_ocean.y_max
local y_min = Everness.settings.biomes.everness_cursed_lands_ocean.y_min
-- Cursed Lands Ocean
Everness:register_biome({
name = 'everness:cursed_lands_ocean',
node_top = 'everness:cursed_stone',
depth_top = 1,
node_filler = 'everness:cursed_stone',
depth_filler = 3,
node_riverbed = 'everness:cursed_stone',
depth_riverbed = 2,
node_stone = 'everness:cursed_stone_carved',
node_cave_liquid = 'mapgen_water_source',
node_dungeon = 'everness:cursed_lands_deep_ocean_sandstone_block',
node_dungeon_alt = 'everness:cursed_lands_deep_ocean_sandstone_brick',
node_dungeon_stair = 'stairs:stair_cursed_lands_deep_ocean_sandstone_block',
y_max = y_max,
y_min = y_min,
heat_point = 45,
humidity_point = 85,
})
--
-- Register ores
--
-- Blob ore.
-- These before scatter ores to avoid other ores in blobs.
-- Clay
Everness:register_ore({
ore_type = 'blob',
ore = 'default:clay',
wherein = { 'everness:cursed_stone', 'everness:cursed_stone_carved' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = -316,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:cursed_lands_ocean' }
})
-- Sand
Everness:register_ore({
ore_type = 'blob',
ore = 'everness:cursed_sand',
wherein = { 'everness:cursed_stone', 'everness:cursed_stone_carved' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = 2316,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:cursed_lands_ocean' }
})
-- Dirt
Everness:register_ore({
ore_type = 'blob',
ore = 'everness:cursed_dirt',
wherein = { 'everness:cursed_stone', 'everness:cursed_stone_carved' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = 766,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:cursed_lands_ocean' }
})
-- Mud
Everness:register_ore({
ore_type = 'blob',
ore = 'everness:cursed_mud',
wherein = { 'everness:cursed_stone', 'everness:cursed_stone_carved' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = 17676,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:cursed_lands_ocean' }
})
-- Scatter ores
-- Coal
Everness:register_ore({
ore_type = 'scatter',
ore = 'everness:cursed_stone_carved_with_coal',
wherein = 'everness:cursed_stone_carved',
clust_scarcity = 8 * 8 * 8,
clust_num_ores = 9,
clust_size = 3,
y_max = y_max,
y_min = y_min,
biomes = { 'everness:cursed_lands_ocean' }
})
--
-- Register decorations
--
Everness:register_decoration({
name = 'everness:cursed_lands_ocean_dry_tree',
deco_type = 'schematic',
place_on = {
'everness:dirt_with_cursed_grass',
'everness:cursed_dirt',
'everness:cursed_sand',
'everness:cursed_stone'
},
place_offset_y = 0,
sidelen = 16,
noise_params = {
offset = 0.0015,
scale = 0.0021,
spread = { x = 250, y = 250, z = 250 },
seed = 2,
octaves = 3,
persist = 0.66
},
biomes = { 'everness:cursed_lands_ocean' },
y_max = y_max,
y_min = y_max - (y_max + 1),
schematic = core.get_modpath('everness') .. '/schematics/everness_dry_tree.mts',
flags = 'place_center_x, place_center_z',
rotation = 'random',
})
-- Spine Kelp
Everness:register_decoration({
name = 'everness:sand_with_spine_kelp',
deco_type = 'simple',
place_on = { 'everness:cursed_stone' },
place_offset_y = -1,
sidelen = 16,
noise_params = {
offset = -0.04,
scale = 0.1,
spread = { x = 200, y = 200, z = 200 },
seed = 87112,
octaves = 3,
persist = 0.7
},
biomes = { 'everness:cursed_lands_ocean' },
y_max = y_max - (y_max + 5),
y_min = y_max - (y_max + 10),
flags = 'force_placement',
decoration = {
'everness:sand_with_spine_kelp',
'everness:coral_skeleton'
},
param2 = 48,
param2_max = 96,
})
+293
View File
@@ -0,0 +1,293 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--
-- Register biomes
--
local y_max = Everness.settings.biomes.everness_cursed_lands_swamp.y_max
local y_min = Everness.settings.biomes.everness_cursed_lands_swamp.y_min
-- Cursed Lands Swamp
Everness:register_biome({
name = 'everness:cursed_lands_swamp',
node_top = 'everness:cursed_stone',
depth_top = 1,
node_filler = 'everness:cursed_stone',
depth_filler = 3,
node_riverbed = 'everness:cursed_stone',
depth_riverbed = 2,
node_stone = 'everness:cursed_stone_carved',
node_dungeon = 'everness:cursed_sandstone_brick',
node_dungeon_alt = 'everness:cursed_sandstone_block',
node_dungeon_stair = 'stairs:stair_cursed_sandstone_brick',
y_max = y_max,
y_min = y_min,
heat_point = 45,
humidity_point = 85,
})
--
-- Register ores
--
-- Blob ore.
-- These before scatter ores to avoid other ores in blobs.
-- Sand
Everness:register_ore({
ore_type = 'blob',
ore = 'everness:cursed_sand',
wherein = { 'everness:cursed_stone_carved' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = 2316,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:cursed_lands_swamp' }
})
-- Dirt
Everness:register_ore({
ore_type = 'blob',
ore = 'everness:cursed_dirt',
wherein = { 'everness:cursed_stone_carved' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = 766,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:cursed_lands_swamp' }
})
-- Mud
Everness:register_ore({
ore_type = 'blob',
ore = 'everness:cursed_mud',
wherein = { 'everness:cursed_stone_carved' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = 17676,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:cursed_lands_swamp' }
})
-- Scatter ores
-- Coal
Everness:register_ore({
ore_type = 'scatter',
ore = 'everness:cursed_stone_carved_with_coal',
wherein = 'everness:cursed_stone_carved',
clust_scarcity = 8 * 8 * 8,
clust_num_ores = 9,
clust_size = 3,
y_max = y_max,
y_min = y_min,
biomes = { 'everness:cursed_lands_swamp' }
})
--
-- Register decorations
--
Everness:register_decoration({
name = 'everness:cursed_lands_swamp_dry_tree',
deco_type = 'schematic',
place_on = { 'everness:cursed_stone' },
place_offset_y = 0,
sidelen = 16,
-- Noise tuned to place swamp trees where papyrus is absent
noise_params = {
offset = 0.0,
scale = -0.1,
spread = { x = 200, y = 200, z = 200 },
seed = 354,
octaves = 1,
persist = 0.5
},
biomes = { 'everness:cursed_lands_swamp' },
y_max = y_min,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_dry_tree.mts',
flags = 'place_center_x, place_center_z',
rotation = 'random',
})
Everness:register_decoration({
name = 'everness:cursed_lands_swamp_marsh_grass',
deco_type = 'schematic',
place_on = { 'everness:cursed_stone' },
place_offset_y = 1,
sidelen = 16,
-- Noise tuned to place where papyrus is absent
noise_params = {
offset = 0.0,
scale = -0.1,
spread = { x = 200, y = 200, z = 200 },
seed = 354,
octaves = 1,
persist = 0.5
},
biomes = { 'everness:cursed_lands_swamp' },
y_max = y_max,
y_min = y_max,
schematic = core.get_modpath('everness') .. '/schematics/everness_marsh_grass.mts',
})
--
-- On Generated
--
local chance = 30
local disp = 16
local schem = core.get_modpath('everness') .. '/schematics/everness_cursed_cabin.mts'
local size = { x = 7, y = 7, z = 12 }
local size_x = math.round(size.x / 2)
local size_z = math.round(size.z / 2)
local y_dis = -1
local c_cursed_stone = core.get_content_id('everness:cursed_stone')
local c_water_source = core.get_content_id('mapgen_water_source')
local biome_id_everness_cursed_lands_swamp = core.get_biome_id('everness:cursed_lands_swamp')
Everness:add_to_queue_on_generated({
name = 'everness:cursed_lands_swamp',
can_run = function(biomemap, chunk_biomes)
return (chunk_biomes and chunk_biomes[biome_id_everness_cursed_lands_swamp]) or table.indexof(biomemap, biome_id_everness_cursed_lands_swamp) ~= -1
end,
after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args)
local sidelength = maxp.x - minp.x + 1
local x_disp = rand:next(0, disp)
local z_disp = rand:next(0, disp)
shared_args.schem_positions = {}
for y = minp.y, maxp.y do
local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp)
if data[vi + area.ystride] == c_water_source
and data[vi] == c_cursed_stone
and rand:next(0, 100) < chance
then
local s_pos = area:position(vi)
--
-- Cursed Cabin
--
-- add Y displacement
local schem_pos = vector.new(s_pos.x, s_pos.y - y_dis, s_pos.z)
-- find floor big enough
local positions = core.find_nodes_in_area_under_air(
vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z),
{
'everness:cursed_stone',
'mapgen_water_source'
}
)
if #positions < size.x * size.z then
-- not enough space
return
end
-- enough air to place structure ?
local air_positions = core.find_nodes_in_area(
vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z),
{
'air',
'mapgen_water_source'
}
)
if #air_positions > (size.x * size.y * size.z) / 2 then
core.place_schematic_on_vmanip(
vm,
schem_pos,
schem,
'random',
nil,
true,
'place_center_x, place_center_z'
)
shared_args.schem_positions.everness_cursed_cabin = shared_args.schem_positions.everness_cursed_cabin or {}
table.insert(shared_args.schem_positions.everness_cursed_cabin, {
pos = schem_pos,
minp = vector.new(s_pos.x - size_x, s_pos.y - y_dis, s_pos.z - size_z),
maxp = vector.new(s_pos.x + size_x, s_pos.y - y_dis + size.y, s_pos.z + size_z)
})
core.log('action', '[Everness] Cursed Cabin was placed at ' .. schem_pos:to_string())
end
end
end
end,
after_write_to_map = function(shared_args)
local schem_positions = shared_args.schem_positions or {}
for name, tbl in pairs(schem_positions) do
if next(tbl) then
for i, v in ipairs(tbl) do
local chest_positions = core.find_nodes_in_area(
v.minp,
v.maxp,
{ 'everness:chest' }
)
if #chest_positions > 0 then
Everness:populate_loot_chests(chest_positions)
end
end
end
end
end
})
+296
View File
@@ -0,0 +1,296 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--
-- Register biomes
--
local y_max = Everness.settings.biomes.everness_cursed_lands_under.y_max
local y_min = Everness.settings.biomes.everness_cursed_lands_under.y_min
-- Cursed Lands Under
Everness:register_biome({
name = 'everness:cursed_lands_under',
node_cave_liquid = { 'mapgen_water_source', 'mapgen_lava_source' },
node_dungeon = 'everness:cursed_brick',
node_dungeon_alt = 'everness:cursed_brick_with_growth',
node_dungeon_stair = 'stairs:stair_cursed_brick',
y_max = y_max,
y_min = y_min,
heat_point = 45,
humidity_point = 85,
})
--
-- Register decorations
--
Everness:register_decoration({
name = 'everness:cursed_lands_under_soul_sandstone_floors',
deco_type = 'simple',
place_on = { 'default:stone' },
place_offset_y = -1,
sidelen = 16,
fill_ratio = 10,
biomes = { 'everness:cursed_lands_under' },
y_max = y_max,
y_min = y_min,
flags = 'all_floors, force_placement',
decoration = {
'everness:soul_sandstone_veined'
},
})
Everness:register_decoration({
name = 'everness:cursed_lands_under_mold_stone_ceilings',
deco_type = 'simple',
place_on = { 'default:stone' },
sidelen = 16,
fill_ratio = 0.4,
biomes = { 'everness:cursed_lands_under' },
y_max = y_max,
y_min = y_min,
flags = 'all_ceilings',
decoration = {
'everness:moss_block'
},
})
Everness:register_decoration({
name = 'everness:cursed_lands_under_skull_with_candle',
deco_type = 'simple',
place_on = { 'everness:soul_sandstone_veined' },
sidelen = 16,
noise_params = {
offset = -0.004,
scale = 0.01,
spread = { x = 100, y = 100, z = 100 },
seed = 137,
octaves = 3,
persist = 0.7,
},
biomes = { 'everness:cursed_lands_under' },
y_max = y_max - 1000 > y_min and y_max - 1000 or y_max,
y_min = y_min,
decoration = 'everness:skull_with_candle',
flags = 'all_floors',
param2_max = 3
})
Everness:register_decoration({
name = 'everness:cursed_lands_under_vines',
deco_type = 'simple',
place_on = { 'everness:moss_block' },
sidelen = 16,
fill_ratio = 0.09,
biomes = { 'everness:cursed_lands_under' },
param2 = 8,
decoration = {
'everness:eye_vine_1',
'everness:eye_vine_2',
'everness:ivis_vine_1',
'everness:ivis_vine_2'
},
y_max = y_max,
y_min = y_min,
flags = 'all_ceilings',
spawn_by = 'air',
num_spawn_by = 8
})
Everness:register_decoration({
name = 'everness:cursed_lands_under_pumpkin_lantern',
deco_type = 'simple',
place_on = { 'everness:soul_sandstone_veined' },
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.002,
spread = { x = 250, y = 250, z = 250 },
seed = 2,
octaves = 3,
persist = 0.66
},
biomes = { 'everness:cursed_lands_under' },
y_max = y_max - 500 > y_min and y_max - 500 or y_max,
y_min = y_min,
decoration = { 'everness:cursed_pumpkin_lantern' },
flags = 'all_floors',
param2_max = 3
})
Everness:register_decoration({
name = 'everness:cursed_lands_under_cursed_dream_tree',
deco_type = 'simple',
place_on = { 'everness:soul_sandstone_veined' },
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.002,
spread = { x = 250, y = 250, z = 250 },
seed = 2,
octaves = 3,
persist = 0.66
},
biomes = { 'everness:cursed_lands_under' },
y_max = y_max - 1500 > y_min and y_max - 1500 or y_max,
y_min = y_min,
flags = 'all_floors',
decoration = {
'everness:marker'
},
})
Everness:register_decoration({
name = 'everness:cursed_lands_under_plants',
deco_type = 'simple',
place_on = { 'everness:soul_sandstone_veined' },
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.02,
spread = { x = 200, y = 200, z = 200 },
seed = 329,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:cursed_lands_under' },
y_max = y_max,
y_min = y_min,
decoration = {
'everness:egg_plant',
'everness:ngrass_1',
'everness:ngrass_2',
},
flags = 'all_floors',
})
Everness:register_decoration({
name = 'everness:cursed_lands_under_ivis_moss',
deco_type = 'simple',
place_on = { 'everness:soul_sandstone_veined' },
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.02,
spread = { x = 200, y = 200, z = 200 },
seed = 329,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:cursed_lands_under' },
y_max = y_max,
y_min = y_min,
decoration = {
'everness:ivis_moss',
},
flags = 'all_floors',
param2 = 0,
param2_max = 239,
})
Everness:register_decoration({
name = 'everness:cursed_lands_under_cobweb_floors',
deco_type = 'simple',
place_on = { 'everness:soul_sandstone_veined' },
sidelen = 16,
fill_ratio = 0.02,
biomes = { 'everness:cursed_lands_under' },
y_max = y_max,
y_min = y_min,
decoration = { 'everness:cobweb' },
flags = 'all_floors'
})
--
-- On Generated
--
local biome_id_everness_cursed_lands_under = core.get_biome_id('everness:cursed_lands_under')
local deco_id_cursed_lands_under_cursed_dream_tree = core.get_decoration_id('everness:cursed_lands_under_cursed_dream_tree')
local schem_cursed_dream_tree = core.get_modpath('everness') .. '/schematics/everness_cursed_dream_tree.mts'
local cursed_dream_tree_size = { x = 17, y = 15, z = 17 }
local cursed_dream_tree_size_x = math.round(cursed_dream_tree_size.x / 2)
local cursed_dream_tree_size_z = math.round(cursed_dream_tree_size.z / 2)
local cursed_dream_tree_safe_volume = (cursed_dream_tree_size.x * cursed_dream_tree_size.y * cursed_dream_tree_size.z) / 1.5
local cursed_dream_tree_y_dis = 1
local cursed_dream_tree_place_on = Everness.to_set(core.registered_decorations['everness:cursed_lands_under_cursed_dream_tree'].place_on)
Everness:register_gen_notify_decoration(deco_id_cursed_lands_under_cursed_dream_tree)
Everness:add_to_queue_on_generated({
name = 'everness:cursed_lands_under',
can_run = function(biomemap, chunk_biomes)
return (chunk_biomes and chunk_biomes[biome_id_everness_cursed_lands_under]) or table.indexof(biomemap, biome_id_everness_cursed_lands_under) ~= -1
end,
after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args)
--
-- Cursed Dream Tree
--
for _, pos in ipairs(gennotify['decoration#' .. (deco_id_cursed_lands_under_cursed_dream_tree or '')] or {}) do
-- `pos` is position of the 'place_on' node
local marker_pos = vector.new(pos.x, pos.y + 1, pos.z)
local marker_node = core.get_node(marker_pos)
local place_on_node = core.get_node(pos)
if marker_node and marker_node.name == 'everness:marker' then
-- remove marker
core.remove_node(marker_pos)
if place_on_node and cursed_dream_tree_place_on[place_on_node.name] then
-- enough air to place structure ?
local positions = core.find_nodes_in_area(
vector.new(
pos.x - cursed_dream_tree_size_x,
pos.y - cursed_dream_tree_y_dis,
pos.z - cursed_dream_tree_size_z
),
vector.new(
pos.x + cursed_dream_tree_size_x,
pos.y - cursed_dream_tree_y_dis + cursed_dream_tree_size.y,
pos.z + cursed_dream_tree_size_z
),
{
'air',
'everness:dry_tree'
},
true
)
local air = positions.air or {}
local tree = positions['everness:dry_tree'] or {}
if #air > cursed_dream_tree_safe_volume and #tree <= 1 then
core.place_schematic_on_vmanip(
vm,
vector.new(marker_pos.x, marker_pos.y - cursed_dream_tree_y_dis, marker_pos.z),
schem_cursed_dream_tree,
'random',
nil,
true,
'place_center_x, place_center_z'
)
-- core.log('action', '[Everness] Cursed Dream Tree was placed at ' .. pos:to_string())
end
end
end
end
end
})
+304
View File
@@ -0,0 +1,304 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--
-- Register biomes
--
local y_max = Everness.settings.biomes.everness_forsaken_desert.y_max
local y_min = Everness.settings.biomes.everness_forsaken_desert.y_min
-- Forsaken Desert
Everness:register_biome({
name = 'everness:forsaken_desert',
node_top = 'everness:forsaken_desert_sand',
depth_top = 1,
node_stone = 'everness:forsaken_desert_stone',
node_filler = 'everness:forsaken_desert_sand',
depth_filler = 1,
node_riverbed = 'everness:forsaken_desert_sand',
depth_riverbed = 2,
node_dungeon = 'everness:forsaken_desert_brick',
node_dungeon_alt = 'everness:forsaken_desert_brick_red',
node_dungeon_stair = 'stairs:stair_forsaken_desert_brick',
y_max = y_max,
y_min = y_min,
heat_point = 100,
humidity_point = 30,
})
--
-- Register ores
--
-- Stratum ores.
-- These obviously first.
Everness:register_ore({
ore_type = 'stratum',
ore = 'everness:forsaken_desert_cobble',
wherein = { 'everness:forsaken_desert_stone' },
clust_scarcity = 1,
y_max = (y_max - y_max) + 46,
y_min = (y_max - y_max) + 4,
noise_params = {
offset = 28,
scale = 16,
spread = { x = 128, y = 128, z = 128 },
seed = 90122,
octaves = 1,
},
stratum_thickness = 4,
biomes = { 'everness:forsaken_desert' },
})
Everness:register_ore({
ore_type = 'stratum',
ore = 'everness:forsaken_desert_cobble',
wherein = { 'everness:forsaken_desert_stone' },
clust_scarcity = 1,
y_max = (y_max - y_max) + 42,
y_min = (y_max - y_max) + 6,
noise_params = {
offset = 24,
scale = 16,
spread = { x = 128, y = 128, z = 128 },
seed = 90122,
octaves = 1,
},
stratum_thickness = 2,
biomes = { 'everness:forsaken_desert' },
})
--
-- Register decorations
--
Everness:register_decoration({
name = 'everness:forsaken_desert_sand_plants_1',
deco_type = 'simple',
place_on = { 'everness:forsaken_desert_sand' },
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.02,
spread = { x = 200, y = 200, z = 200 },
seed = 329,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:forsaken_desert' },
y_max = y_max,
y_min = y_min,
decoration = { 'everness:forsaken_desert_plant_1' },
param2 = 11,
})
Everness:register_decoration({
name = 'everness:forsaken_desert_sand_plants_2',
deco_type = 'simple',
place_on = { 'everness:forsaken_desert_sand' },
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.02,
spread = { x = 200, y = 200, z = 200 },
seed = 329,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:forsaken_desert' },
y_max = y_max,
y_min = y_min,
decoration = {
'everness:forsaken_desert_plant_2',
'everness:forsaken_desert_plant_3'
},
param2 = 8,
})
Everness:register_decoration({
name = 'everness:forsaken_desert_termite_nest',
deco_type = 'schematic',
place_on = { 'everness:forsaken_desert_sand' },
sidelen = 16,
noise_params = {
offset = -0.004,
scale = 0.01,
spread = { x = 100, y = 100, z = 100 },
seed = 137,
octaves = 3,
persist = 0.7,
},
biomes = { 'everness:forsaken_desert' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_termite_nest.mts',
flags = 'place_center_x, place_center_z',
rotation = 'random',
})
Everness:register_decoration({
name = 'everness:forsaken_desert_hollow_tree',
deco_type = 'schematic',
place_on = { 'everness:forsaken_desert_sand' },
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.002,
spread = { x = 250, y = 250, z = 250 },
seed = 2,
octaves = 3,
persist = 0.66
},
biomes = { 'everness:forsaken_desert' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_hollow_tree.mts',
flags = 'place_center_x, place_center_z',
rotation = 'random',
})
Everness:register_decoration({
name = 'everness:forsaken_desert_hollow_tree_large',
deco_type = 'schematic',
place_on = { 'everness:forsaken_desert_sand' },
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.001,
spread = { x = 250, y = 250, z = 250 },
seed = 2,
octaves = 3,
persist = 0.66
},
biomes = { 'everness:forsaken_desert' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_hollow_tree_large.mts',
flags = 'place_center_x, place_center_z',
rotation = 'random',
})
--
-- On Generated
--
local chance = 20
local disp = 16
local schem = core.get_modpath('everness') .. '/schematics/everness_forsaken_desert_temple.mts'
local size = { x = 9, y = 16, z = 9 }
local size_x = math.round(size.x / 2)
local size_z = math.round(size.z / 2)
local c_forsaken_desert_sand = core.get_content_id('everness:forsaken_desert_sand')
local biome_id_everness_forsaken_desert = core.get_biome_id('everness:forsaken_desert')
Everness:add_to_queue_on_generated({
name = 'everness:forsaken_desert',
can_run = function(biomemap, chunk_biomes)
return (chunk_biomes and chunk_biomes[biome_id_everness_forsaken_desert]) or table.indexof(biomemap, biome_id_everness_forsaken_desert) ~= -1
end,
after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args)
local sidelength = maxp.x - minp.x + 1
local x_disp = rand:next(0, disp)
local z_disp = rand:next(0, disp)
shared_args.schem_positions = {}
for y = minp.y, maxp.y do
local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp)
if data[vi + area.ystride] == core.CONTENT_AIR
and data[vi] == c_forsaken_desert_sand
and rand:next(0, 100) < chance
then
local s_pos = area:position(vi)
--
-- Forsaken Desert Temple
--
local schem_pos = vector.new(s_pos.x, s_pos.y, s_pos.z)
-- find floor big enough
local positions = core.find_nodes_in_area_under_air(
vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z),
{
'everness:forsaken_desert_sand'
}
)
if #positions < size.x * size.z then
-- not enough space
return
end
-- enough air to place structure ?
local air_positions = core.find_nodes_in_area(
vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z),
{
'air'
}
)
if #air_positions > (size.x * size.y * size.z) / 2 then
core.place_schematic_on_vmanip(
vm,
schem_pos,
schem,
'random',
nil,
true,
'place_center_x, place_center_z'
)
shared_args.schem_positions.everness_forsaken_desert_temple = shared_args.schem_positions.everness_forsaken_desert_temple or {}
table.insert(shared_args.schem_positions.everness_forsaken_desert_temple, {
pos = schem_pos,
minp = vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z),
maxp = vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z)
})
core.log('action', '[Everness] Forsaken Desert Temple was placed at ' .. schem_pos:to_string())
end
end
end
end,
after_write_to_map = function(shared_args)
local schem_positions = shared_args.schem_positions or {}
for name, tbl in pairs(schem_positions) do
if next(tbl) then
for i, v in ipairs(tbl) do
local chest_positions = core.find_nodes_in_area(
v.minp,
v.maxp,
{ 'everness:chest' }
)
if #chest_positions > 0 then
Everness:populate_loot_chests(chest_positions)
end
end
end
end
end
})
@@ -0,0 +1,155 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--
-- Register biomes
--
local y_max = Everness.settings.biomes.everness_forsaken_desert_ocean.y_max
local y_min = Everness.settings.biomes.everness_forsaken_desert_ocean.y_min
-- Forsaken Desert Ocean
Everness:register_biome({
name = 'everness:forsaken_desert_ocean',
node_top = 'everness:dry_ocean_dirt',
depth_top = 1,
node_stone = 'everness:forsaken_desert_stone',
node_filler = 'everness:dry_ocean_dirt',
depth_filler = 3,
node_water_top = 'everness:dry_ocean_dirt',
depth_water_top = 10,
node_river_water = 'everness:dry_ocean_dirt',
node_riverbed = 'everness:dry_ocean_dirt',
depth_riverbed = 2,
node_dungeon = 'everness:forsaken_desert_brick',
node_dungeon_alt = 'everness:forsaken_desert_brick_red',
node_dungeon_stair = 'stairs:stair_forsaken_desert_brick',
y_max = y_max,
y_min = y_min,
heat_point = 100,
humidity_point = 30,
})
--
-- On Generated
--
local chance = 20
local disp = 16
local schem = core.get_modpath('everness') .. '/schematics/everness_forsaken_desert_temple_3.mts'
local size = { x = 11, y = 13, z = 13 }
local size_x = math.round(size.x / 2)
local size_z = math.round(size.z / 2)
local y_dis = -1
local c_dry_ocean_dirt = core.get_content_id('everness:dry_ocean_dirt')
local biome_id_everness_forsaken_desert_ocean = core.get_biome_id('everness:forsaken_desert_ocean')
Everness:add_to_queue_on_generated({
name = 'everness:forsaken_desert_ocean',
can_run = function(biomemap, chunk_biomes)
return (chunk_biomes and chunk_biomes[biome_id_everness_forsaken_desert_ocean]) or table.indexof(biomemap, biome_id_everness_forsaken_desert_ocean) ~= -1
end,
after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args)
local sidelength = maxp.x - minp.x + 1
local x_disp = rand:next(0, disp)
local z_disp = rand:next(0, disp)
shared_args.schem_positions = {}
for y = minp.y, maxp.y do
local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp)
if data[vi + area.ystride] == core.CONTENT_AIR
and data[vi] == c_dry_ocean_dirt
and rand:next(0, 100) < chance
then
local s_pos = area:position(vi)
--
-- Forsaken Desert Temple 3
--
local schem_pos = vector.new(s_pos.x, s_pos.y - y_dis, s_pos.z)
-- find floor big enough
local positions = core.find_nodes_in_area_under_air(
vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z),
{
'everness:dry_ocean_dirt'
}
)
if #positions < size.x * size.z then
-- not enough space
return
end
-- enough air to place structure ?
local air_positions = core.find_nodes_in_area(
vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z),
{
'air'
}
)
if #air_positions > (size.x * size.y * size.z) / 2 then
core.place_schematic_on_vmanip(
vm,
schem_pos,
schem,
'random',
nil,
true,
'place_center_x, place_center_z'
)
shared_args.schem_positions.everness_forsaken_desert_temple_3 = shared_args.schem_positions.everness_forsaken_desert_temple_3 or {}
table.insert(shared_args.schem_positions.everness_forsaken_desert_temple_3, {
pos = schem_pos,
minp = vector.new(s_pos.x - size_x, s_pos.y - y_dis, s_pos.z - size_z),
maxp = vector.new(s_pos.x + size_x, s_pos.y - y_dis + size.y, s_pos.z + size_z)
})
core.log('action', '[Everness] Forsaken Desert Temple 3 was placed at ' .. schem_pos:to_string())
end
end
end
end,
after_write_to_map = function(shared_args)
local schem_positions = shared_args.schem_positions or {}
for name, tbl in pairs(schem_positions) do
if next(tbl) then
for i, v in ipairs(tbl) do
local chest_positions = core.find_nodes_in_area(
v.minp,
v.maxp,
{ 'everness:chest' }
)
if #chest_positions > 0 then
Everness:populate_loot_chests(chest_positions)
end
end
end
end
end
})
@@ -0,0 +1,331 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--
-- Register biomes
--
local y_max = Everness.settings.biomes.everness_forsaken_desert_under.y_max
local y_min = Everness.settings.biomes.everness_forsaken_desert_under.y_min
-- Forsaken Desert Under
Everness:register_biome({
name = 'everness:forsaken_desert_under',
node_cave_liquid = { 'mapgen_water_source', 'mapgen_lava_source' },
node_dungeon = 'default:cobble',
node_dungeon_alt = 'default:mossycobble',
node_dungeon_stair = 'stairs:stair_cobble',
y_max = y_max,
y_min = y_min,
heat_point = 100,
humidity_point = 30,
})
--
-- Register decorations
--
Everness:register_decoration({
name = 'everness:forsaken_desert_under_floors',
deco_type = 'simple',
place_on = { 'default:stone' },
sidelen = 16,
place_offset_y = -1,
fill_ratio = 10,
biomes = { 'everness:forsaken_desert_under' },
y_max = y_max,
y_min = y_min,
flags = 'all_floors, force_placement',
decoration = {
'everness:forsaken_desert_sand'
},
})
Everness:register_decoration({
name = 'everness:forsaken_desert_under_floors_chiseled',
deco_type = 'simple',
place_on = { 'everness:forsaken_desert_sand' },
sidelen = 16,
place_offset_y = -1,
fill_ratio = 0.2,
biomes = { 'everness:forsaken_desert_under' },
y_max = y_max - 500 > y_min and y_max - 500 or y_max,
y_min = y_min,
decoration = {
'everness:forsaken_desert_chiseled_stone',
'everness:forsaken_desert_brick',
'everness:forsaken_desert_brick_red',
'everness:forsaken_desert_engraved_stone',
'everness:forsaken_desert_cobble_red',
'everness:forsaken_desert_cobble',
},
flags = 'all_floors, force_placement'
})
Everness:register_decoration({
name = 'everness:forsaken_desert_under_ceilings',
deco_type = 'simple',
place_on = { 'everness:forsaken_desert_sand' },
sidelen = 16,
fill_ratio = 0.4,
biomes = { 'everness:forsaken_desert_under' },
y_max = y_max,
y_min = y_min,
flags = 'all_ceilings',
decoration = {
'everness:moss_block'
},
})
Everness:register_decoration({
name = 'everness:forsaken_desert_under_cactus_blue',
deco_type = 'simple',
place_on = { 'everness:forsaken_desert_sand' },
sidelen = 16,
noise_params = {
offset = -0.004,
scale = 0.01,
spread = { x = 100, y = 100, z = 100 },
seed = 137,
octaves = 3,
persist = 0.7,
},
biomes = { 'everness:forsaken_desert_under' },
y_max = y_max - 500 > y_min and y_max - 500 or y_max,
y_min = y_min,
decoration = 'everness:cactus_blue',
height = 2,
height_max = 6,
flags = 'all_floors'
})
Everness:register_decoration({
name = 'everness:forsaken_desert_under_cave_barrel_cactus',
deco_type = 'simple',
place_on = {
'everness:forsaken_desert_sand',
'everness:forsaken_desert_chiseled_stone',
'everness:forsaken_desert_brick',
'everness:forsaken_desert_engraved_stone'
},
sidelen = 16,
fill_ratio = 0.005,
biomes = { 'everness:forsaken_desert_under' },
y_max = y_max - 250 > y_min and y_max - 250 or y_max,
y_min = y_min,
decoration = {
'everness:cave_barrel_cactus',
'everness:venus_trap'
},
flags = 'all_floors',
param2_max = 3
})
Everness:register_decoration({
name = 'everness:forsaken_desert_under_cave_illumi_root',
deco_type = 'simple',
place_on = {
'everness:forsaken_desert_sand',
'everness:forsaken_desert_chiseled_stone',
'everness:forsaken_desert_brick',
'everness:forsaken_desert_engraved_stone'
},
sidelen = 16,
fill_ratio = 0.005,
biomes = { 'everness:forsaken_desert_under' },
y_max = y_max,
y_min = y_min,
decoration = { 'everness:illumi_root' },
flags = 'all_floors'
})
Everness:register_decoration({
name = 'everness:forsaken_desert_under_vines',
deco_type = 'simple',
place_on = { 'everness:moss_block' },
sidelen = 16,
fill_ratio = 0.09,
biomes = { 'everness:forsaken_desert_under' },
param2 = 8,
decoration = {
'everness:dense_vine_1',
'everness:dense_vine_2'
},
y_max = y_max,
y_min = y_min,
flags = 'all_ceilings',
spawn_by = 'air',
num_spawn_by = 8
})
Everness:register_decoration({
name = 'everness:forsaken_desert_under_hollow_tree',
deco_type = 'simple',
place_on = { 'everness:forsaken_desert_sand' },
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.006,
spread = { x = 250, y = 250, z = 250 },
seed = 2,
octaves = 3,
persist = 0.66
},
biomes = { 'everness:forsaken_desert_under' },
y_max = y_max,
y_min = y_min,
decoration = 'everness:hollow_tree',
height = 3,
height_max = 7,
flags = 'all_floors'
})
--
-- On Generated
--
local disp = 16
local chance = 20
local schem = core.get_modpath('everness') .. '/schematics/everness_forsaken_desert_temple_2.mts'
local size = { x = 16, y = 17, z = 15 }
local size_x = math.round(size.x / 2)
local size_z = math.round(size.z / 2)
local c_forsaken_desert_sand = core.get_content_id('everness:forsaken_desert_sand')
local c_forsaken_desert_chiseled_stone = core.get_content_id('everness:forsaken_desert_chiseled_stone')
local c_forsaken_desert_brick = core.get_content_id('everness:forsaken_desert_brick')
local c_forsaken_desert_engraved_stone = core.get_content_id('everness:forsaken_desert_engraved_stone')
local biome_id_everness_forsaken_desert_under = core.get_biome_id('everness:forsaken_desert_under')
Everness:add_to_queue_on_generated({
name = 'everness:forsaken_desert_under',
can_run = function(biomemap, chunk_biomes)
return (chunk_biomes and chunk_biomes[biome_id_everness_forsaken_desert_under]) or table.indexof(biomemap, biome_id_everness_forsaken_desert_under) ~= -1
end,
after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args)
local sidelength = maxp.x - minp.x + 1
local x_disp = rand:next(0, disp)
local z_disp = rand:next(0, disp)
shared_args.schem_positions = {}
for y = minp.y, maxp.y do
local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp)
if
(
data[vi] == c_forsaken_desert_sand
or data[vi] == c_forsaken_desert_chiseled_stone
or data[vi] == c_forsaken_desert_brick
or data[vi] == c_forsaken_desert_engraved_stone
)
and rand:next(0, 100) < chance
then
local s_pos = area:position(vi)
--
-- Forsaken Desert Temple 2
--
local schem_pos = vector.new(s_pos.x, s_pos.y, s_pos.z)
-- find floor big enough
local positions = core.find_nodes_in_area_under_air(
vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z),
{
'everness:forsaken_desert_sand',
'everness:forsaken_desert_chiseled_stone',
'everness:forsaken_desert_brick',
'everness:forsaken_desert_engraved_stone',
'group:stone',
'group:sand',
'group:everness_sand',
'default:gravel',
'default:stone_with_coal',
'default:stone_with_iron',
'default:stone_with_copper',
'default:stone_with_tin',
'default:stone_with_gold',
'default:stone_with_mese',
'default:stone_with_diamond',
'everness:cave_barrel_cactus',
'everness:venus_trap',
'group:flora',
'everness:quartz_ore',
'everness:stone_with_pyrite',
}
)
if #positions < size.x * size.z then
-- not enough space
return
end
-- enough air to place structure ?
local air_positions = core.find_nodes_in_area(
vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z),
{
'air'
}
)
if #air_positions > (size.x * size.y * size.z) / 2 then
core.place_schematic_on_vmanip(
vm,
schem_pos,
schem,
'random',
nil,
true,
'place_center_x, place_center_z'
)
shared_args.schem_positions.everness_forsaken_desert_temple_2 = shared_args.schem_positions.everness_forsaken_desert_temple_2 or {}
table.insert(shared_args.schem_positions.everness_forsaken_desert_temple_2, {
pos = schem_pos,
minp = vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z),
maxp = vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z)
})
core.log('action', '[Everness] Forsaken Desert Temple 2 was placed at ' .. schem_pos:to_string())
end
end
end
end,
after_write_to_map = function(shared_args)
local schem_positions = shared_args.schem_positions or {}
for name, tbl in pairs(schem_positions) do
if next(tbl) then
for i, v in ipairs(tbl) do
local chest_positions = core.find_nodes_in_area(
v.minp,
v.maxp,
{ 'everness:chest' }
)
if #chest_positions > 0 then
Everness:populate_loot_chests(chest_positions)
end
end
end
end
end
})
+368
View File
@@ -0,0 +1,368 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--
-- Register biomes
--
local y_max = Everness.settings.biomes.everness_forsaken_tundra.y_max
local y_min = Everness.settings.biomes.everness_forsaken_tundra.y_min
-- Forsaken Tundra
Everness:register_biome({
name = 'everness:forsaken_tundra',
node_top = 'everness:forsaken_tundra_dirt',
depth_top = 1,
node_stone = 'everness:forsaken_tundra_stone',
node_filler = 'everness:forsaken_tundra_dirt',
depth_filler = 1,
node_riverbed = 'everness:forsaken_tundra_beach_sand',
depth_riverbed = 2,
node_dungeon = 'everness:forsaken_tundra_cobble',
node_dungeon_alt = 'everness:forsaken_tundra_brick',
node_dungeon_stair = 'stairs:stair_forsaken_tundra_cobble',
y_max = y_max,
y_min = y_min,
heat_point = 10,
humidity_point = 10,
})
--
-- Register ores
--
-- Blob ore.
-- These before scatter ores to avoid other ores in blobs.
Everness:register_ore({
ore_type = 'blob',
ore = 'everness:sulfur_stone',
wherein = { 'default:stone', 'everness:forsaken_tundra_stone' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = -316,
octaves = 1,
persist = 0.0
},
biomes = {'everness:forsaken_tundra' }
})
--
-- Register decorations
--
Everness:register_decoration({
name = 'everness:forsaken_tundra_volcanic_sulfur',
deco_type = 'simple',
place_on = { 'everness:forsaken_tundra_dirt' },
sidelen = 4,
noise_params = {
offset = -0.7,
scale = 4.0,
spread = { x = 16, y = 16, z = 16 },
seed = 513337,
octaves = 1,
persist = 0.0,
flags = 'absvalue, eased'
},
biomes = { 'everness:forsaken_tundra' },
y_max = y_max,
y_min = y_min,
decoration = { 'everness:volcanic_sulfur' },
place_offset_y = -1,
flags = 'force_placement',
})
Everness:register_decoration({
name = 'everness:forsaken_tundra_sulfur_stone',
deco_type = 'simple',
place_on = {
'everness:forsaken_tundra_dirt',
'everness:volcanic_sulfur'
},
sidelen = 4,
noise_params = {
offset = -4,
scale = 4,
spread = { x = 50, y = 50, z = 50 },
seed = 7013,
octaves = 3,
persist = 0.7,
},
biomes = { 'everness:forsaken_tundra' },
y_max = y_max,
y_min = y_min,
place_offset_y = -1,
flags = 'force_placement',
decoration = { 'everness:sulfur_stone' },
})
Everness:register_decoration({
name = 'everness:forsaken_tundra_dirt_with_grass',
deco_type = 'simple',
place_on = {
'everness:forsaken_tundra_dirt',
'everness:volcanic_sulfur'
},
sidelen = 4,
noise_params = {
offset = -0.8,
scale = 2.0,
spread = { x = 100, y = 100, z = 100 },
seed = 53995,
octaves = 3,
persist = 1.0
},
biomes = { 'everness:forsaken_tundra' },
y_max = y_max,
y_min = y_min,
decoration = 'everness:forsaken_tundra_dirt_with_grass',
place_offset_y = -1,
flags = 'force_placement',
})
Everness:register_decoration({
name = 'everness:forsaken_tundra_volcanic_sulfur_on_top_of_sulfur_stone',
deco_type = 'simple',
place_on = { 'everness:sulfur_stone' },
sidelen = 4,
noise_params = {
offset = -4,
scale = 4,
spread = { x = 50, y = 50, z = 50 },
seed = 7013,
octaves = 3,
persist = 0.7,
},
biomes = { 'everness:forsaken_tundra' },
y_max = y_max,
y_min = y_min,
decoration = { 'everness:volcanic_sulfur' },
})
Everness:register_decoration({
name = 'everness:forsaken_tundra_rocks',
deco_type = 'schematic',
place_on = { 'everness:forsaken_tundra_dirt', 'everness:forsaken_tundra_dirt_with_grass' },
sidelen = 16,
noise_params = {
offset = -0.004,
scale = 0.01,
spread = { x = 100, y = 100, z = 100 },
seed = 137,
octaves = 3,
persist = 0.7,
},
biomes = { 'everness:forsaken_tundra' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_forsaken_tundra_rocks.mts',
flags = 'place_center_x, place_center_z',
rotation = 'random',
})
Everness:register_decoration({
name = 'everness:forsaken_tundra_sulfur_volcano',
deco_type = 'schematic',
place_on = { 'everness:forsaken_tundra_dirt', 'everness:volcanic_sulfur' },
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.002,
spread = { x = 250, y = 250, z = 250 },
seed = 2,
octaves = 3,
persist = 0.66
},
biomes = { 'everness:forsaken_tundra' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_sulfur_volcano.mts',
flags = 'place_center_x, place_center_z',
rotation = 'random',
spawn_by = { 'everness:forsaken_tundra_dirt', 'everness:volcanic_sulfur' },
num_spawn_by = 8,
})
Everness:register_decoration({
name = 'everness:forsaken_tundra_bloodpore_plant',
deco_type = 'simple',
place_on = { 'everness:forsaken_tundra_dirt_with_grass' },
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:forsaken_tundra' },
y_max = y_max,
y_min = y_min,
decoration = 'everness:bloodspore_plant',
param2 = 8,
})
Everness:register_decoration({
name = 'everness:forsaken_tundra_bloodspore_plant_on_dirt',
deco_type = 'simple',
place_on = { 'everness:forsaken_tundra_dirt' },
spawn_by = 'everness:forsaken_tundra_dirt_with_grass',
num_spawn_by = 1,
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:forsaken_tundra' },
y_max = y_max,
y_min = y_min,
decoration = 'everness:bloodspore_plant',
param2 = 8,
})
--
-- On Generated
--
local chance = 20
local disp = 16
local schem = core.read_schematic(core.get_modpath('everness') .. '/schematics/everness_jungle_temple.mts', {})
local size = { x = 12, y = 14, z = 15 }
local size_x = math.round(size.x / 2)
local size_z = math.round(size.z / 2)
local y_dis = 3
local c_everness_forsaken_tundra_dirt = core.get_content_id('everness:forsaken_tundra_dirt')
local c_everness_forsaken_tundra_dirt_with_grass = core.get_content_id('everness:forsaken_tundra_dirt_with_grass')
local c_everness_volcanic_sulfur = core.get_content_id('everness:volcanic_sulfur')
local biome_id_everness_forsaken_tundra = core.get_biome_id('everness:forsaken_tundra')
Everness:add_to_queue_on_generated({
name = 'everness:forsaken_tundra',
can_run = function(biomemap, chunk_biomes)
return (chunk_biomes and chunk_biomes[biome_id_everness_forsaken_tundra]) or table.indexof(biomemap, biome_id_everness_forsaken_tundra) ~= -1
end,
after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args)
local sidelength = maxp.x - minp.x + 1
local x_disp = rand:next(0, disp)
local z_disp = rand:next(0, disp)
shared_args.schem_positions = {}
for y = minp.y, maxp.y do
local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp)
if data[vi + area.ystride] == core.CONTENT_AIR
and (
data[vi] == c_everness_forsaken_tundra_dirt
or data[vi] == c_everness_forsaken_tundra_dirt_with_grass
or data[vi] == c_everness_volcanic_sulfur
)
and rand:next(0, 100) < chance
then
local s_pos = area:position(vi)
--
-- Jungle Temple
--
-- add Y displacement
local schem_pos = vector.new(s_pos.x, s_pos.y - y_dis, s_pos.z)
-- find floor big enough
local positions = core.find_nodes_in_area_under_air(
vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z),
{
'everness:forsaken_tundra_dirt',
'everness:forsaken_tundra_dirt_with_grass',
'everness:volcanic_sulfur'
}
)
if #positions < size.x * size.z then
-- not enough space
return
end
-- enough air to place structure ?
local air_positions = core.find_nodes_in_area(
vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z),
{
'air'
}
)
if #air_positions > (size.x * size.y * size.z) / 2 then
core.place_schematic_on_vmanip(
vm,
schem_pos,
schem,
'random',
nil,
true,
'place_center_x, place_center_z'
)
shared_args.schem_positions.everness_jungle_temple = shared_args.schem_positions.everness_jungle_temple or {}
table.insert(shared_args.schem_positions.everness_jungle_temple, {
pos = schem_pos,
minp = vector.new(s_pos.x - size_x, s_pos.y - y_dis, s_pos.z - size_z),
maxp = vector.new(s_pos.x + size_x, s_pos.y - y_dis + size.y, s_pos.z + size_z)
})
core.log('action', '[Everness] Jungle Temple was placed at ' .. schem_pos:to_string())
end
end
end
end,
after_write_to_map = function(shared_args)
local schem_positions = shared_args.schem_positions or {}
for name, tbl in pairs(schem_positions) do
if next(tbl) then
for i, v in ipairs(tbl) do
local chest_positions = core.find_nodes_in_area(
v.minp,
v.maxp,
{ 'everness:chest' }
)
if #chest_positions > 0 then
Everness:populate_loot_chests(chest_positions)
end
end
end
end
end
})
@@ -0,0 +1,94 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--
-- Register biomes
--
local y_max = Everness.settings.biomes.everness_forsaken_tundra_beach.y_max
local y_min = Everness.settings.biomes.everness_forsaken_tundra_beach.y_min
-- Forsaken Tundra Beach
Everness:register_biome({
name = 'everness:forsaken_tundra_beach',
node_top = 'everness:forsaken_tundra_beach_sand',
depth_top = 1,
node_filler = 'everness:forsaken_tundra_beach_sand',
depth_filler = 2,
node_riverbed = 'everness:forsaken_tundra_beach_sand',
depth_riverbed = 2,
node_dungeon = 'everness:forsaken_tundra_cobble',
node_dungeon_alt = 'everness:forsaken_tundra_brick',
node_dungeon_stair = 'stairs:stair_forsaken_tundra_cobble',
vertical_blend = 1,
y_max = y_max,
y_min = y_min,
heat_point = 10,
humidity_point = 10,
})
--
-- Register ores
--
-- Blob ore.
-- These before scatter ores to avoid other ores in blobs.
Everness:register_ore({
ore_type = 'blob',
ore = 'everness:sulfur_stone',
wherein = { 'default:stone', 'everness:forsaken_tundra_stone' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = -316,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:forsaken_tundra_beach' }
})
--
-- Register decorations
--
Everness:register_decoration({
name = 'everness:forsaken_tundra_beach_sand_with_shells',
deco_type = 'simple',
place_on = { 'everness:forsaken_tundra_beach_sand' },
sidelen = 4,
noise_params = {
offset = -4,
scale = 4,
spread = { x = 50, y = 50, z = 50 },
seed = 7013,
octaves = 3,
persist = 0.7,
},
biomes = { 'everness:forsaken_tundra_beach' },
y_max = y_max,
y_min = y_min,
place_offset_y = -1,
flags = 'force_placement',
decoration = { 'everness:forsaken_tundra_beach_sand_with_shells' },
})
@@ -0,0 +1,96 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--
-- Register biomes
--
local y_max = Everness.settings.biomes.everness_forsaken_tundra_ocean.y_max
local y_min = Everness.settings.biomes.everness_forsaken_tundra_ocean.y_min
-- Forsaken Tundra Ocean
Everness:register_biome({
name = 'everness:forsaken_tundra_ocean',
node_top = 'everness:forsaken_tundra_beach_sand',
depth_top = 1,
node_stone = 'everness:forsaken_tundra_stone',
node_filler = 'everness:forsaken_tundra_beach_sand',
depth_filler = 3,
node_riverbed = 'everness:forsaken_tundra_beach_sand',
depth_riverbed = 2,
node_cave_liquid = 'mapgen_water_source',
node_dungeon = 'everness:forsaken_tundra_cobble',
node_dungeon_alt = 'everness:forsaken_tundra_brick',
node_dungeon_stair = 'stairs:stair_forsaken_tundra_cobble',
vertical_blend = 1,
y_max = y_max,
y_min = y_min,
heat_point = 10,
humidity_point = 10,
})
--
-- Register ores
--
-- Blob ore.
-- These before scatter ores to avoid other ores in blobs.
Everness:register_ore({
ore_type = 'blob',
ore = 'everness:sulfur_stone',
wherein = { 'default:stone', 'everness:forsaken_tundra_stone' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = -316,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:forsaken_tundra_ocean' }
})
--
-- Register decorations
--
Everness:register_decoration({
name = 'everness:forsaken_tundra_beach_sand_with_shells',
deco_type = 'simple',
place_on = { 'everness:forsaken_tundra_beach_sand' },
sidelen = 4,
noise_params = {
offset = -4,
scale = 4,
spread = { x = 50, y = 50, z = 50 },
seed = 7013,
octaves = 3,
persist = 0.7,
},
biomes = { 'everness:forsaken_tundra_ocean' },
y_max = y_max,
y_min = y_min,
place_offset_y = -1,
flags = 'force_placement',
decoration = { 'everness:forsaken_tundra_beach_sand_with_shells' },
})
@@ -0,0 +1,354 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--
-- Register biomes
--
local y_max = Everness.settings.biomes.everness_forsaken_tundra_under.y_max
local y_min = Everness.settings.biomes.everness_forsaken_tundra_under.y_min
-- Forsaken Tundra Under
Everness:register_biome({
name = 'everness:forsaken_tundra_under',
node_cave_liquid = { 'mapgen_water_source', 'mapgen_lava_source' },
node_dungeon = 'everness:forsaken_tundra_cobble',
node_dungeon_alt = 'everness:forsaken_tundra_brick',
node_dungeon_stair = 'stairs:stair_forsaken_tundra_cobble',
y_max = y_max,
y_min = y_min,
heat_point = 10,
humidity_point = 10,
})
--
-- Register ores
--
-- Blob ore.
-- These before scatter ores to avoid other ores in blobs.
Everness:register_ore({
ore_type = 'blob',
ore = 'everness:sulfur_stone',
wherein = { 'default:stone', 'everness:forsaken_tundra_stone' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = -316,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:forsaken_tundra_under' }
})
--
-- Register decorations
--
Everness:register_decoration({
name = 'everness:forsaken_tundra_under_mold_stone_floors',
deco_type = 'simple',
place_on = { 'default:stone' },
sidelen = 16,
place_offset_y = -1,
fill_ratio = 10,
biomes = { 'everness:forsaken_tundra_under' },
y_max = y_max,
y_min = y_min,
flags = 'all_floors, force_placement',
decoration = {
'everness:mold_stone_with_moss'
},
})
Everness:register_decoration({
name = 'everness:forsaken_tundra_under_mold_stone_ceilings',
deco_type = 'simple',
place_on = { 'default:stone' },
sidelen = 16,
fill_ratio = 0.4,
biomes = { 'everness:forsaken_tundra_under' },
y_max = y_max,
y_min = y_min,
flags = 'all_ceilings',
decoration = {
'everness:moss_block'
},
})
Everness:register_decoration({
name = 'everness:forsaken_tundra_under_obsidian_floors',
deco_type = 'simple',
place_on = { 'default:stone', 'everness:mold_stone_with_moss' },
sidelen = 16,
place_offset_y = -1,
fill_ratio = 0.02,
biomes = { 'everness:forsaken_tundra_under' },
y_max = y_max - 500 > y_min and y_max - 500 or y_max,
y_min = y_min,
decoration = {
'everness:blue_crying_obsidian',
'everness:blue_weeping_obsidian',
'everness:weeping_obsidian'
},
flags = 'all_floors, force_placement'
})
Everness:register_decoration({
name = 'everness:forsaken_tundra_under_obsidian_ceilings',
deco_type = 'simple',
place_on = { 'default:stone', 'everness:moss_block' },
sidelen = 16,
place_offset_y = -1,
fill_ratio = 0.02,
biomes = { 'everness:forsaken_tundra_under' },
y_max = y_max - 500 > y_min and y_max - 500 or y_max,
y_min = y_min,
decoration = {
'everness:blue_crying_obsidian',
'everness:blue_weeping_obsidian',
'everness:weeping_obsidian'
},
flags = 'all_ceilings, force_placement'
})
Everness:register_decoration({
name = 'everness:forsaken_tundra_under_cactus_orange',
deco_type = 'simple',
place_on = { 'everness:mold_stone_with_moss' },
sidelen = 16,
noise_params = {
offset = -0.004,
scale = 0.01,
spread = { x = 100, y = 100, z = 100 },
seed = 137,
octaves = 3,
persist = 0.7,
},
biomes = { 'everness:forsaken_tundra_under' },
y_max = y_max - 500 > y_min and y_max - 500 or y_max,
y_min = y_min,
decoration = 'everness:cactus_orange',
height = 2,
height_max = 6,
flags = 'all_floors'
})
Everness:register_decoration({
name = 'everness:forsaken_tundra_under_willow_tree',
deco_type = 'simple',
place_on = {
'everness:mold_stone_with_moss',
'everness:blue_crying_obsidian',
'everness:blue_weeping_obsidian',
'everness:weeping_obsidian'
},
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.002,
spread = { x = 250, y = 250, z = 250 },
seed = 2,
octaves = 3,
persist = 0.66
},
biomes = { 'everness:forsaken_tundra_under' },
y_max = y_max - 1500 > y_min and y_max - 1500 or y_max,
y_min = y_min,
flags = 'all_floors',
decoration = {
'everness:marker'
},
})
Everness:register_decoration({
name = 'everness:forsaken_tundra_under_bloodspore_plant_small',
deco_type = 'simple',
place_on = { 'everness:mold_stone_with_moss' },
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.02,
spread = { x = 200, y = 200, z = 200 },
seed = 329,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:forsaken_tundra_under' },
y_max = y_max,
y_min = y_min,
decoration = 'everness:bloodspore_plant_small',
param2 = 8,
flags = 'all_floors'
})
Everness:register_decoration({
name = 'everness:forsaken_tundra_under_vines',
deco_type = 'simple',
place_on = { 'everness:moss_block' },
sidelen = 16,
fill_ratio = 0.09,
biomes = { 'everness:forsaken_tundra_under' },
param2 = 8,
decoration = {
'everness:whispering_gourd_vine_1',
'everness:whispering_gourd_vine_2',
'everness:bulb_vine_1',
'everness:bulb_vine_2'
},
y_max = y_max,
y_min = y_min,
flags = 'all_ceilings',
spawn_by = 'air',
num_spawn_by = 8
})
Everness:register_decoration({
name = 'everness:forsaken_tundra_under_glowing_pillar',
deco_type = 'simple',
place_on = { 'everness:mold_stone_with_moss' },
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.002,
spread = { x = 250, y = 250, z = 250 },
seed = 2,
octaves = 3,
persist = 0.66
},
biomes = { 'everness:forsaken_tundra_under' },
y_max = y_max - 1000 > y_min and y_max - 1000 or y_max,
y_min = y_min,
decoration = { 'everness:glowing_pillar' },
flags = 'all_floors',
})
local function register_agave_leaf_decoration(offset, scale, length)
Everness:register_decoration({
name = 'everness:forsaken_tundra_under_agave_leaf_' .. length,
deco_type = 'simple',
place_on = { 'everness:mold_stone_with_moss' },
sidelen = 16,
noise_params = {
offset = offset,
scale = scale,
spread = { x = 200, y = 200, z = 200 },
seed = 329,
octaves = 3,
persist = 0.6
},
param2 = 8,
biomes = { 'everness:forsaken_tundra_under' },
y_max = y_max,
y_min = y_min,
decoration = 'everness:agave_leaf_' .. length,
flags = 'all_floors'
})
end
-- Grasses
register_agave_leaf_decoration(-0.03, 0.09, 3)
register_agave_leaf_decoration(-0.015, 0.075, 2)
register_agave_leaf_decoration(0, 0.06, 1)
--
-- On Generated
--
local biome_id_everness_forsaken_tundra_under = core.get_biome_id('everness:forsaken_tundra_under')
local deco_id_everness_forsaken_tundra_under_willow_tree = core.get_decoration_id('everness:forsaken_tundra_under_willow_tree')
local willow_tree_schem = core.get_modpath('everness') .. '/schematics/everness_willow_tree.mts'
local size = { x = 39, y = 28, z = 39 }
local size_x = math.round(size.x / 2)
local size_z = math.round(size.z / 2)
local safe_volume = (size.x * size.y * size.z) / 1.5
local y_dis = 1
local willow_tree_place_on = Everness.to_set(core.registered_decorations['everness:forsaken_tundra_under_willow_tree'].place_on)
Everness:register_gen_notify_decoration(deco_id_everness_forsaken_tundra_under_willow_tree)
Everness:add_to_queue_on_generated({
name = 'everness:forsaken_tundra_under',
can_run = function(biomemap, chunk_biomes)
return (chunk_biomes and chunk_biomes[biome_id_everness_forsaken_tundra_under]) or table.indexof(biomemap, biome_id_everness_forsaken_tundra_under) ~= -1
end,
after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args)
--
-- Willow Tree
--
for _, pos in ipairs(gennotify['decoration#' .. (deco_id_everness_forsaken_tundra_under_willow_tree or '')] or {}) do
-- `pos` is position of the 'place_on' node
local marker_pos = vector.new(pos.x, pos.y + 1, pos.z)
local marker_node = core.get_node(marker_pos)
local place_on_node = core.get_node(pos)
if marker_node and marker_node.name == 'everness:marker' then
-- remove marker
core.remove_node(marker_pos)
if place_on_node and willow_tree_place_on[place_on_node.name] then
-- enough air to place structure ?
local positions = core.find_nodes_in_area(
vector.new(
pos.x - size_x,
pos.y - y_dis,
pos.z - size_z
),
vector.new(
pos.x + size_x,
pos.y - y_dis + size.y,
pos.z + size_z
),
{
'air',
'everness:willow_tree'
},
true
)
local air = positions.air or {}
local tree = positions['everness:willow_tree'] or {}
if #air > safe_volume and #tree == 0 then
core.place_schematic_on_vmanip(
vm,
vector.new(marker_pos.x, marker_pos.y - y_dis, marker_pos.z),
willow_tree_schem,
'random',
nil,
true,
'place_center_x, place_center_z'
)
-- core.log('action', '[Everness] Willow Tree was placed at ' .. pos:to_string())
end
end
end
end
end
})
+238
View File
@@ -0,0 +1,238 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--
-- Register biomes
--
local y_max = Everness.settings.biomes.everness_frosted_icesheet.y_max
local y_min = Everness.settings.biomes.everness_frosted_icesheet.y_min
-- Frosted Icesheet
Everness:register_biome({
name = 'everness:frosted_icesheet',
node_dust = 'everness:frosted_snowblock',
node_top = 'everness:frosted_snowblock',
depth_top = 1,
node_filler = 'everness:frosted_snowblock',
depth_filler = 3,
node_stone = 'everness:frosted_cave_ice',
node_water_top = 'everness:frosted_ice',
depth_water_top = 2,
node_river_water = 'everness:frosted_ice',
node_riverbed = 'everness:gravel',
depth_riverbed = 2,
node_dungeon = 'everness:icecobble',
node_dungeon_alt = 'everness:snowcobble',
node_dungeon_stair = 'stairs:stair_ice',
y_max = y_max,
y_min = y_min,
heat_point = 0,
humidity_point = 93,
})
--
-- Register decorations
--
-- Frosted Icesheet
Everness:register_decoration({
name = 'everness:frosted_icesheet_stalagmite',
deco_type = 'schematic',
schematic = core.get_modpath('everness') .. '/schematics/everness_frosted_lands_stalagmite.mts',
place_on = { 'everness:frosted_snowblock' },
place_offset_y = 1,
sidelen = 16,
noise_params = {
offset = 0.0008,
scale = 0.0007,
spread = { x = 250, y = 250, z = 250 },
seed = 2,
octaves = 3,
persist = 0.66
},
biomes = { 'everness:frosted_icesheet' },
y_max = y_max,
y_min = (y_max - y_max) + 4,
flags = 'place_center_x, place_center_z',
spawn_by = 'everness:frosted_snowblock',
num_spawn_by = 8,
})
Everness:register_decoration({
name = 'everness:frosted_icesheet_volcanic_rock',
deco_type = 'schematic',
schematic = core.get_modpath('everness') .. '/schematics/everness_frosted_lands_volcanic_rock.mts',
place_on = { 'everness:frosted_snowblock' },
sidelen = 16,
noise_params = {
offset = 0.0008,
scale = 0.0007,
spread = { x = 250, y = 250, z = 250 },
seed = 2,
octaves = 3,
persist = 0.66
},
biomes = { 'everness:frosted_icesheet' },
y_max = y_max,
y_min = (y_max - y_max) + 2,
flags = 'place_center_x, place_center_z',
rotation = 'random',
spawn_by = 'everness:frosted_snowblock',
num_spawn_by = 8,
})
Everness:register_decoration({
name = 'everness:frosted_icesheet_fossils',
deco_type = 'schematic',
schematic = core.get_modpath('everness') .. '/schematics/everness_frosted_lands_fossils.mts',
place_on = { 'everness:frosted_snowblock' },
sidelen = 16,
place_offset_y = 1,
noise_params = {
offset = 0.0008,
scale = 0.0007,
spread = { x = 250, y = 250, z = 250 },
seed = 2,
octaves = 3,
persist = 0.66
},
biomes = { 'everness:frosted_icesheet' },
y_max = y_max,
y_min = (y_max - y_max) + 1,
flags = 'place_center_x, place_center_z',
rotation = 'random',
spawn_by = 'everness:frosted_snowblock',
num_spawn_by = 8,
})
--
-- On Generated
--
local chance = 20
local disp = 16
local schem = core.read_schematic(core.get_modpath('everness') .. '/schematics/everness_frosted_icesheet_igloo.mts', {})
local size = { x = 16, y = 13, z = 16 }
local size_x = math.round(size.x / 2)
local size_z = math.round(size.z / 2)
local y_dis = 8
local c_frosted_snowblock = core.get_content_id('everness:frosted_snowblock')
local c_frosted_ice = core.get_content_id('everness:frosted_ice')
local biome_id_everness_frosted_icesheet = core.get_biome_id('everness:frosted_icesheet')
Everness:add_to_queue_on_generated({
name = 'everness:frosted_icesheet',
can_run = function(biomemap, chunk_biomes)
return (chunk_biomes and chunk_biomes[biome_id_everness_frosted_icesheet]) or table.indexof(biomemap, biome_id_everness_frosted_icesheet) ~= -1
end,
after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args)
local sidelength = maxp.x - minp.x + 1
local x_disp = rand:next(0, disp)
local z_disp = rand:next(0, disp)
shared_args.schem_positions = {}
for y = minp.y, maxp.y do
local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp)
if data[vi + area.ystride] == core.CONTENT_AIR
and (
data[vi] == c_frosted_snowblock
or data[vi] == c_frosted_ice
)
and rand:next(0, 100) < chance
then
local s_pos = area:position(vi)
--
-- Igloo
--
-- add Y displacement
local schem_pos = vector.new(s_pos.x, s_pos.y - y_dis, s_pos.z)
-- find floor big enough
local positions = core.find_nodes_in_area_under_air(
vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z),
{
'everness:frosted_snowblock',
'everness:frosted_ice'
}
)
if #positions < size.x * size.z then
-- not enough space
return
end
-- enough air to place structure ?
local air_positions = core.find_nodes_in_area(
vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z),
{
'air'
}
)
if #air_positions > (size.x * size.y * size.z) / 2 then
core.place_schematic_on_vmanip(
vm,
schem_pos,
schem,
'random',
nil,
true,
'place_center_x, place_center_z'
)
shared_args.schem_positions.everness_frosted_icesheet_igloo = shared_args.schem_positions.everness_frosted_icesheet_igloo or {}
table.insert(shared_args.schem_positions.everness_frosted_icesheet_igloo, {
pos = schem_pos,
minp = vector.new(s_pos.x - size_x, s_pos.y - y_dis, s_pos.z - size_z),
maxp = vector.new(s_pos.x + size_x, s_pos.y - y_dis + size.y, s_pos.z + size_z)
})
core.log('action', '[Everness] Igloo was placed at ' .. schem_pos:to_string())
end
end
end
end,
after_write_to_map = function(shared_args)
local schem_positions = shared_args.schem_positions or {}
for name, tbl in pairs(schem_positions) do
if next(tbl) then
for i, v in ipairs(tbl) do
local chest_positions = core.find_nodes_in_area(
v.minp,
v.maxp,
{ 'everness:chest' }
)
if #chest_positions > 0 then
Everness:populate_loot_chests(chest_positions)
end
end
end
end
end
})
@@ -0,0 +1,73 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--
-- Register biomes
--
local y_max = Everness.settings.biomes.everness_frosted_icesheet_ocean.y_max
local y_min = Everness.settings.biomes.everness_frosted_icesheet_ocean.y_min
-- Frosted Icesheet Ocean
Everness:register_biome({
name = 'everness:frosted_icesheet_ocean',
node_top = 'default:sand',
depth_top = 1,
node_filler = 'default:sand',
depth_filler = 3,
node_water_top = 'everness:frosted_ice',
depth_water_top = 2,
node_cave_liquid = 'mapgen_water_source',
node_dungeon = 'everness:icecobble',
node_dungeon_alt = 'everness:snowcobble',
node_dungeon_stair = 'stairs:stair_ice',
y_max = y_max,
y_min = y_min,
heat_point = 0,
humidity_point = 93,
})
--
-- Register decorations
--
-- Frosted Icesheet Ocean
Everness:register_decoration({
name = 'everness:frosted_icesheet_ocean_corals',
deco_type = 'simple',
place_on = { 'default:sand' },
place_offset_y = -1,
sidelen = 4,
noise_params = {
offset = -4,
scale = 4,
spread = { x = 50, y = 50, z = 50 },
seed = 7013,
octaves = 3,
persist = 0.7,
},
biomes = { 'everness:frosted_icesheet_ocean' },
y_max = y_max - (y_max + 2), -- -2
y_min = y_max - (y_max + 50), -- -50
flags = 'force_placement',
decoration = {
'everness:coral_starfish',
'everness:coral_frosted',
'everness:coral_skeleton'
},
})
@@ -0,0 +1,402 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--
-- Register biomes
--
local y_max = Everness.settings.biomes.everness_frosted_icesheet_under.y_max
local y_min = Everness.settings.biomes.everness_frosted_icesheet_under.y_min
-- Frosted Icesheet Under
Everness:register_biome({
name = 'everness:frosted_icesheet_under',
node_cave_liquid = { 'mapgen_water_source', 'mapgen_lava_source' },
node_dungeon = 'everness:icecobble',
node_dungeon_alt = 'everness:snowcobble',
node_dungeon_stair = 'stairs:stair_ice',
y_max = y_max,
y_min = y_min,
heat_point = 0,
humidity_point = 93,
})
--
-- Register ores
--
-- Blob ore.
-- These before scatter ores to avoid other ores in blobs.
Everness:register_ore({
ore_type = 'blob',
ore = 'everness:bone',
wherein = { 'default:stone' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = -316,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:frosted_icesheet_under' }
})
--
-- Register decorations
--
Everness:register_decoration({
name = 'everness:frosted_icesheet_under_floors',
deco_type = 'simple',
place_on = { 'default:stone' },
place_offset_y = -1,
sidelen = 16,
fill_ratio = 10,
biomes = { 'everness:frosted_icesheet_under' },
y_max = y_max,
y_min = y_min,
flags = 'all_floors, force_placement',
decoration = {
'everness:ancient_emerald_ice',
'everness:dense_emerald_ice',
'everness:emerald_ice',
'everness:frosted_ice',
'everness:frosted_ice_translucent',
},
})
Everness:register_decoration({
name = 'everness:frosted_icesheet_under_ceilings',
deco_type = 'simple',
place_on = { 'default:stone' },
sidelen = 16,
fill_ratio = 0.4,
biomes = { 'everness:frosted_icesheet_under' },
y_max = y_max,
y_min = y_min,
flags = 'all_ceilings',
decoration = {
'everness:ancient_emerald_ice',
'everness:dense_emerald_ice',
'everness:emerald_ice',
'everness:frosted_ice',
'everness:frosted_ice_translucent',
},
})
Everness:register_decoration({
name = 'everness:frosted_icesheet_under_illuminating_floors',
deco_type = 'simple',
place_on = {
'everness:ancient_emerald_ice',
'everness:dense_emerald_ice',
'everness:emerald_ice',
'everness:frosted_ice',
'everness:frosted_ice_translucent',
},
sidelen = 16,
place_offset_y = -1,
fill_ratio = 0.01,
biomes = { 'everness:frosted_icesheet_under' },
y_max = y_max,
y_min = y_min,
decoration = { 'everness:frosted_cave_ice_illuminating' },
flags = 'all_floors, force_placement'
})
Everness:register_decoration({
name = 'everness:frosted_icesheet_under_illuminating_ceilings',
deco_type = 'simple',
place_on = {
'everness:ancient_emerald_ice',
'everness:dense_emerald_ice',
'everness:emerald_ice',
'everness:frosted_ice',
'everness:frosted_ice_translucent',
},
sidelen = 16,
place_offset_y = -1,
fill_ratio = 0.01,
biomes = { 'everness:frosted_icesheet_under' },
y_max = y_max,
y_min = y_min,
decoration = { 'everness:frosted_cave_ice_illuminating' },
flags = 'all_ceilings, force_placement'
})
Everness:register_decoration({
name = 'everness:frosted_icesheet_under_amaranita_lantern',
deco_type = 'simple',
place_on = {
'everness:ancient_emerald_ice',
'everness:dense_emerald_ice',
'everness:emerald_ice',
'everness:frosted_ice',
'everness:frosted_ice_translucent',
},
sidelen = 16,
noise_params = {
offset = -0.004,
scale = 0.01,
spread = { x = 100, y = 100, z = 100 },
seed = 137,
octaves = 3,
persist = 0.7,
},
biomes = { 'everness:frosted_icesheet_under' },
y_max = y_max - 500 > y_min and y_max - 500 or y_max,
y_min = y_min,
decoration = { 'everness:amaranita_lantern' },
flags = 'all_floors',
})
Everness:register_decoration({
name = 'everness:frosted_icesheet_under_vines',
deco_type = 'simple',
place_on = {
'everness:ancient_emerald_ice',
'everness:dense_emerald_ice',
'everness:emerald_ice',
'everness:frosted_ice',
'everness:frosted_ice_translucent',
},
sidelen = 16,
fill_ratio = 0.09,
biomes = { 'everness:frosted_icesheet_under' },
param2 = 8,
decoration = {
'everness:tenanea_flowers_vine_1',
'everness:tenanea_flowers_vine_2',
'everness:reeds_vine_1',
'everness:reeds_vine_2'
},
y_max = y_max,
y_min = y_min,
flags = 'all_ceilings',
spawn_by = 'air',
num_spawn_by = 8
})
Everness:register_decoration({
name = 'everness:frosted_icicle_large_ceiling',
deco_type = 'schematic',
place_on = {
'everness:ancient_emerald_ice',
'everness:dense_emerald_ice',
'everness:emerald_ice',
'everness:frosted_ice',
'everness:frosted_ice_translucent',
},
sidelen = 16,
noise_params = {
offset = -0.004,
scale = 0.01,
spread = { x = 100, y = 100, z = 100 },
seed = 137,
octaves = 3,
persist = 0.7,
},
biomes = { 'everness:frosted_icesheet_under' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_frosted_icicle_large_ceiling.mts',
flags = 'place_center_x, place_center_z, all_ceilings',
rotation = 'random',
})
Everness:register_decoration({
name = 'everness:frosted_icicle_large_floor',
deco_type = 'schematic',
place_on = {
'everness:ancient_emerald_ice',
'everness:dense_emerald_ice',
'everness:emerald_ice',
'everness:frosted_ice',
'everness:frosted_ice_translucent',
},
sidelen = 16,
noise_params = {
offset = -0.004,
scale = 0.01,
spread = { x = 100, y = 100, z = 100 },
seed = 137,
octaves = 3,
persist = 0.7,
},
biomes = { 'everness:frosted_icesheet_under' },
y_max = y_max,
y_min = y_min,
schematic = core.get_modpath('everness') .. '/schematics/everness_frosted_icicle_large_floor.mts',
flags = 'place_center_x, place_center_z, all_floors',
rotation = 'random',
})
Everness:register_decoration({
name = 'everness:frosted_icesheet_under_plants',
deco_type = 'simple',
place_on = {
'everness:ancient_emerald_ice',
'everness:dense_emerald_ice',
'everness:emerald_ice',
'everness:frosted_ice',
'everness:frosted_ice_translucent',
},
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.02,
spread = { x = 200, y = 200, z = 200 },
seed = 329,
octaves = 3,
persist = 0.6
},
param2 = 8,
biomes = { 'everness:frosted_icesheet_under' },
y_max = y_max,
y_min = y_min,
decoration = {
'everness:blooming_cooksonia',
'everness:frosted_icicle_floor',
},
flags = 'all_floors',
})
Everness:register_decoration({
name = 'everness:frosted_icesheet_under_plants_2',
deco_type = 'simple',
place_on = {
'everness:ancient_emerald_ice',
'everness:dense_emerald_ice',
'everness:emerald_ice',
'everness:frosted_ice',
'everness:frosted_ice_translucent',
},
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.02,
spread = { x = 200, y = 200, z = 200 },
seed = 329,
octaves = 3,
persist = 0.6
},
biomes = { 'everness:frosted_icesheet_under' },
y_max = y_max,
y_min = y_min,
decoration = { 'everness:creeping_moss_spores' },
flags = 'all_floors',
param2 = 26
})
--
-- On Generated
--
local size_ceiling = { x = 2, y = 19, z = 2 }
local size_ceiling_x = math.round(size_ceiling.x / 2)
local size_ceiling_z = math.round(size_ceiling.z / 2)
local size_floor = { x = 2, y = 20, z = 2 }
local size_floor_x = math.round(size_floor.x / 2)
local size_floor_z = math.round(size_floor.z / 2)
local deco_id_frosted_icicle_large_ceiling = core.get_decoration_id('everness:frosted_icicle_large_ceiling')
local deco_id_frosted_icicle_large_floor = core.get_decoration_id('everness:frosted_icicle_large_floor')
local biome_id_everness_frosted_icesheet_under = core.get_biome_id('everness:frosted_icesheet_under')
Everness:register_gen_notify_decoration({
deco_id_frosted_icicle_large_ceiling,
deco_id_frosted_icicle_large_floor
})
Everness:add_to_queue_on_generated({
name = 'everness:frosted_icesheet_under',
can_run = function(biomemap, chunk_biomes)
return (chunk_biomes and chunk_biomes[biome_id_everness_frosted_icesheet_under]) or table.indexof(biomemap, biome_id_everness_frosted_icesheet_under) ~= -1
end,
after_write_to_map = function(shared_args, gennotify)
--
-- Frosted Large Icicle Ceiling
--
for _, pos in ipairs(gennotify['decoration#' .. deco_id_frosted_icicle_large_ceiling] or {}) do
local markers = core.find_nodes_in_area(
vector.new(pos.x - size_ceiling_x, pos.y - size_ceiling.y + 2, pos.z - size_ceiling_z),
vector.new(pos.x + size_ceiling_x, pos.y - size_ceiling.y, pos.z + size_ceiling_z),
{ 'everness:marker' }
)
if #markers > 0 then
local pos_marker = markers[1]
local air_below = core.find_nodes_in_area(
vector.new(pos_marker.x, pos_marker.y, pos_marker.z),
vector.new(pos_marker.x, pos_marker.y - 7, pos_marker.z),
{'air'}
)
-- Replace marker
core.set_node(pos_marker, { name = 'everness:frosted_cave_ice_illuminating' })
if #air_below == 7 then
local incrementer = 1
local pos_below = vector.new(pos_marker.x, pos_marker.y - incrementer, pos_marker.z)
local node_below = core.get_node(pos_below)
Everness.stack_icicle_recursive(node_below, pos_below, incrementer, pos_marker, 'down')
end
end
end
--
-- Frosted Large Icicle Floor
--
for _, pos in ipairs(gennotify['decoration#' .. deco_id_frosted_icicle_large_floor] or {}) do
local markers = core.find_nodes_in_area(
vector.new(pos.x - size_floor_x, pos.y + size_floor.y - 2, pos.z - size_floor_z),
vector.new(pos.x + size_floor_x, pos.y + size_floor.y, pos.z + size_floor_z),
{ 'everness:marker' }
)
if #markers > 0 then
local pos_marker = markers[1]
local air_above = core.find_nodes_in_area(
vector.new(pos_marker.x, pos_marker.y, pos_marker.z),
vector.new(pos_marker.x, pos_marker.y + 7, pos_marker.z),
{'air'}
)
-- Replace marker
core.set_node(pos_marker, { name = 'everness:frosted_cave_ice_illuminating' })
-- Make sure we have some space
if #air_above == 7 then
local incrementer = 1
local pos_above = vector.new(pos_marker.x, pos_marker.y + incrementer, pos_marker.z)
local node_above = core.get_node(pos_above)
Everness.stack_icicle_recursive(node_above, pos_above, incrementer, pos_marker, 'up')
end
end
end
end
})
+815
View File
@@ -0,0 +1,815 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--
-- Register biomes
--
local y_max = Everness.settings.biomes.everness_mineral_waters.y_max
local y_min = Everness.settings.biomes.everness_mineral_waters.y_min
-- Mineral Waters
Everness:register_biome({
name = 'everness:mineral_waters',
node_top = 'everness:mineral_sand',
depth_top = 1,
node_filler = 'everness:mineral_stone',
depth_filler = 1,
node_stone = 'everness:mineral_stone',
node_riverbed = 'everness:mineral_sand',
depth_riverbed = 2,
node_dungeon = 'everness:mineral_stone_brick',
node_dungeon_alt = 'everness:mineral_stone_brick_with_growth',
node_dungeon_stair = 'stairs:stair_mineral_stone_brick',
y_max = y_max,
y_min = y_min,
vertical_blend = 16,
heat_point = 78,
humidity_point = 58,
})
--
-- Register ores
--
-- Scatter ores
-- Coal
Everness:register_ore({
ore_type = 'scatter',
ore = 'everness:mineral_stone_with_coal',
wherein = 'everness:mineral_stone',
clust_scarcity = 8 * 8 * 8,
clust_num_ores = 9,
clust_size = 3,
y_max = y_max,
y_min = y_min,
biomes = { 'everness:mineral_waters' }
})
Everness:register_ore({
ore_type = 'scatter',
ore = 'everness:mineral_stone_with_ceramic_sherds',
wherein = 'everness:mineral_stone',
clust_scarcity = 14 * 14 * 14,
clust_num_ores = 5,
clust_size = 3,
y_max = y_max,
y_min = y_min,
biomes = { 'everness:mineral_waters' }
})
--
-- On Generated
--
local function find_irecursive(tbl, c_id)
for _, v in ipairs(tbl) do
if type(v) == 'table' then
if find_irecursive(v, c_id) then
return true
end
elseif c_id == v then
return true
end
end
return false
end
-- Get the content IDs for the nodes used
local c_everness_mineral_water_source = core.get_content_id('everness:mineral_water_source')
local c_everness_mineral_stone = core.get_content_id('everness:mineral_stone')
local c_everness_mineral_stone_brick = core.get_content_id('everness:mineral_stone_brick')
local c_everness_mineral_stone_brick_with_growth = core.get_content_id('everness:mineral_stone_brick_with_growth')
local c_everness_mineral_stone_brick_with_flower_growth = core.get_content_id('everness:mineral_stone_brick_with_flower_growth')
local c_everness_mineral_sand = core.get_content_id('everness:mineral_sand')
local c_everness_mineral_sandstone = core.get_content_id('everness:mineral_sandstone')
local c_everness_mineral_sandstone_block = core.get_content_id('everness:mineral_sandstone_block')
local c_everness_chest = core.get_content_id('everness:chest')
local c_everness_mineral_stone_with_coal = core.get_content_id('everness:mineral_stone_with_coal')
local c_everness_mineral_stone_with_ceramic_sherds = core.get_content_id('everness:mineral_stone_with_ceramic_sherds')
local c_everness_lotus_flower_white = core.get_content_id('everness:lotus_flower_white')
local c_everness_lotus_flower_purple = core.get_content_id('everness:lotus_flower_purple')
local c_everness_lotus_flower_pink = core.get_content_id('everness:lotus_flower_pink')
local c_everness_lotus_lotus_leaf = core.get_content_id('everness:lotus_leaf')
local c_everness_lotus_lotus_leaf_2 = core.get_content_id('everness:lotus_leaf_2')
local c_everness_lotus_lotus_leaf_3 = core.get_content_id('everness:lotus_leaf_3')
local c_everness_ceramic_pot_blank = core.get_content_id('everness:ceramic_pot_blank')
local c_everness_ceramic_pot_flowers = core.get_content_id('everness:ceramic_pot_flowers')
local c_everness_ceramic_pot_lines = core.get_content_id('everness:ceramic_pot_lines')
local c_everness_ceramic_pot_tribal = core.get_content_id('everness:ceramic_pot_tribal')
local c_everness_mineral_water_weed_1 = core.get_content_id('everness:mineral_water_weed_1')
local c_everness_mineral_water_weed_2 = core.get_content_id('everness:mineral_water_weed_2')
local c_everness_mineral_water_weed_3 = core.get_content_id('everness:mineral_water_weed_3')
local c_everness_water_geyser = core.get_content_id('everness:water_geyser')
local c_everness_rose_bush = core.get_content_id('everness:rose_bush')
-- Biome IDs
local biome_id_everness_mineral_waters = core.get_biome_id('everness:mineral_waters')
-- Pool building blocks variations
local pool_build_nodes = {
{
c_everness_mineral_stone,
c_everness_mineral_stone_brick,
c_everness_mineral_stone_brick_with_growth,
c_everness_mineral_stone_brick_with_flower_growth
},
{
c_everness_mineral_sandstone,
c_everness_mineral_sandstone_block
}
}
local c_lotus_flowers = {
c_everness_lotus_flower_white,
c_everness_lotus_flower_purple,
c_everness_lotus_flower_pink
}
local c_lotus_leaves = {
c_everness_lotus_lotus_leaf,
c_everness_lotus_lotus_leaf_2,
c_everness_lotus_lotus_leaf_3
}
local c_pots = {
c_everness_ceramic_pot_blank,
c_everness_ceramic_pot_flowers,
c_everness_ceramic_pot_lines,
c_everness_ceramic_pot_tribal
}
local c_water_weeds = {
c_everness_mineral_water_weed_1,
c_everness_mineral_water_weed_2
}
local chance = 20
local disp = 16
local schem = core.get_modpath('everness') .. '/schematics/everness_mineral_waters_tower.mts'
local size = { x = 7, y = 16, z = 9 }
local size_x = math.round(size.x / 2)
local size_z = math.round(size.z / 2)
Everness:add_to_queue_on_generated({
name = 'everness:mineral_waters',
can_run = function(biomemap, chunk_biomes)
return (chunk_biomes and chunk_biomes[biome_id_everness_mineral_waters]) or table.indexof(biomemap, biome_id_everness_mineral_waters) ~= -1
end,
on_data = function(minp, maxp, area, data, p2data, gennotify, rand, shared_args, biomemap)
biomemap = biomemap or core.get_mapgen_object('biomemap') or {}
local csize_x = maxp.x - minp.x + 1
local rand_version = rand:next(1, 2)
local chest_positions = {}
local pot_pos = {}
if rand_version == 1 then
--
-- Pools
--
for y = minp.y, maxp.y do
for z = minp.z, maxp.z do
for x = minp.x, maxp.x do
local b_idx_start = (z - minp.z) * csize_x + (x - minp.x) + 1
if biomemap[b_idx_start] == biome_id_everness_mineral_waters then
local ai = area:index(x, y, z)
local node_cid = data[ai]
local node_name = core.get_name_from_content_id(node_cid)
local node_def = core.registered_nodes[node_name]
local is_start_tree_or_leaf = node_def and node_def.groups and (
(node_def.groups.tree and node_def.groups.tree > 0)
or (node_def.groups.leaves and node_def.groups.leaves > 0)
or (node_def.groups.wood and node_def.groups.wood > 0)
)
local is_start_ground = node_def and node_def.walkable
and not is_start_tree_or_leaf
and (
node_cid == c_everness_mineral_sand
or node_cid == c_everness_mineral_stone
or (node_def.groups and (node_def.groups.sand or node_def.groups.stone or node_def.groups.soil))
)
if
data[ai + area.ystride] == core.CONTENT_AIR
and is_start_ground
then
local length = 5 + rand:next(0, 10)
local width = 5 + rand:next(0, 10)
local height = 3 + rand:next(0, 4)
local walkable_nodes = 0
local invalid_placement = false
-- find space for lake (walkable rectangle)
for li = 1, length do
local x_rec = x + li
for wi = 1, width do
local z_rec = z + wi
local ai_rec = (ai + li) + (area.zstride * wi)
local n_cid = data[ai_rec]
local is_target_biome
-- 1. Fast path: check biomemap flat array (within chunk bounds)
if x_rec >= minp.x and x_rec <= maxp.x and z_rec >= minp.z and z_rec <= maxp.z then
local b_idx = (z_rec - minp.z) * csize_x + (x_rec - minp.x) + 1
is_target_biome = (biomemap[b_idx] == biome_id_everness_mineral_waters)
else
-- 2. Fallback: for coordinates extending outside chunk boundaries
local b_data = core.get_biome_data({ x = x_rec, y = y, z = z_rec })
is_target_biome = (b_data and b_data.biome == biome_id_everness_mineral_waters)
end
if n_cid == core.CONTENT_IGNORE then
if is_target_biome then
walkable_nodes = walkable_nodes + 1
else
invalid_placement = true
break
end
else
local n_name = core.get_name_from_content_id(n_cid)
local n_def = core.registered_nodes[n_name]
local is_tree_or_leaf = n_def and n_def.groups and (
(n_def.groups.tree and n_def.groups.tree > 0)
or (n_def.groups.leaves and n_def.groups.leaves > 0)
or (n_def.groups.wood and n_def.groups.wood > 0)
)
if not is_target_biome or is_tree_or_leaf then
invalid_placement = true
break
end
if n_def
and n_def.walkable
and data[ai_rec + area.ystride] == core.CONTENT_AIR
then
walkable_nodes = walkable_nodes + 1
end
end
end
if invalid_placement then
break
end
end
-- build pool (cuboid)
if not invalid_placement and walkable_nodes >= (width * length * 0.75) then
local pool_build_nodes_group = pool_build_nodes[rand:next(1, #pool_build_nodes)]
-- offset y so the pools are sticking out / sinking in from the ground vertically
local ai_offset_y = ai - (area.ystride * height) + (area.ystride * rand:next(0, math.ceil(height / 2)))
for hi = 1, height do
for li = 1, length do
for wi = 1, width do
local mineral_stone = pool_build_nodes_group[rand:next(1, #pool_build_nodes_group)]
local ai_cub = (ai_offset_y + li) + (area.ystride * hi) + (area.zstride * wi)
local current_c_id = data[ai_cub]
local is_outer_boundary = (hi == 1 or li == 1 or li == length or wi == 1 or wi == width)
if is_outer_boundary then
-- Guarantee 100% solid floor (hi == 1) and all 4 solid perimeter walls to prevent leaks
if not find_irecursive(pool_build_nodes, current_c_id) then
data[ai_cub] = mineral_stone
end
else
-- Interior of the pool: fill with water
data[ai_cub] = c_everness_mineral_water_source
end
-- place loot chest in the middle of the pool floor
if hi == 2
and height > 4
and math.ceil(length / 2) == li
and math.ceil(width / 2) == wi
and data[ai_cub - area.ystride] ~= c_everness_mineral_water_source
and rand:next(0, 100) < 3
then
data[ai_cub] = c_everness_chest
table.insert(chest_positions, vector.new(area:position(ai_cub)))
end
end
end
end
end
end
end
end
end
end
-- Plug any holes along chunk boundaries where adjacent lake chunks placed water
for y = minp.y, maxp.y do
for z = minp.z, maxp.z do
for x = minp.x, maxp.x do
if x == minp.x or x == maxp.x or z == minp.z or z == maxp.z or z == minp.z + 1 or z == maxp.z - 1 then
local ai = area:index(x, y, z)
if data[ai] == core.CONTENT_AIR then
local is_leaking = false
if x == minp.x and data[ai - 1] == c_everness_mineral_water_source then
is_leaking = true
elseif x == maxp.x and data[ai + 1] == c_everness_mineral_water_source then
is_leaking = true
elseif (z == minp.z and (data[ai - area.zstride] == c_everness_mineral_water_source or data[ai - area.zstride * 2] == c_everness_mineral_water_source))
or (z == minp.z + 1 and data[ai - area.zstride * 2] == c_everness_mineral_water_source) then
is_leaking = true
elseif (z == maxp.z and (data[ai + area.zstride] == c_everness_mineral_water_source or data[ai + area.zstride * 2] == c_everness_mineral_water_source))
or (z == maxp.z - 1 and data[ai + area.zstride * 2] == c_everness_mineral_water_source) then
is_leaking = true
end
if is_leaking then
data[ai] = c_everness_mineral_sand
-- Support down if there is air below so the sand wall is solid
local down_count = 1
while down_count <= 8 do
local down_ai = ai - area.ystride * down_count
if data[down_ai] == core.CONTENT_AIR then
data[down_ai] = c_everness_mineral_sand
else
break
end
down_count = down_count + 1
end
end
end
end
end
end
end
elseif rand_version == 2 then
--
-- Lakes
--
local function is_valid_lake_node(c_id, nx, ny, nz)
if c_id == c_everness_mineral_sand
or c_id == c_everness_mineral_water_source
or c_id == c_everness_mineral_stone
or c_id == c_everness_mineral_stone_with_coal
or c_id == c_everness_mineral_stone_with_ceramic_sherds
then
return true
end
-- At chunk boundaries, ungenerated adjacent chunk nodes in data are CONTENT_IGNORE
if c_id == core.CONTENT_IGNORE then
local is_target_biome
if nx >= minp.x and nx <= maxp.x and nz >= minp.z and nz <= maxp.z then
local b_idx = (nz - minp.z) * csize_x + (nx - minp.x) + 1
is_target_biome = (biomemap[b_idx] == biome_id_everness_mineral_waters)
else
local b_data = core.get_biome_data({ x = nx, y = ny, z = nz })
is_target_biome = (b_data and b_data.biome == biome_id_everness_mineral_waters)
end
return is_target_biome == true
end
return false
end
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]
-- Check 4 horizontal cardinal neighbors (+X, -X, +Z, -Z)
local c_right = data[ai + 1]
local c_left = data[ai - 1]
local c_front = data[ai + (area.zstride * 2)]
local c_back = data[ai - (area.zstride * 2)]
local keep_going = true
local while_count = 1
local max_dig_depth = 11
if
c_current == c_everness_mineral_sand
and is_valid_lake_node(c_right, x + 1, y, z)
and is_valid_lake_node(c_left, x - 1, y, z)
and is_valid_lake_node(c_front, x, y, z + 2)
and is_valid_lake_node(c_back, x, y, z - 2)
then
-- dig below
while keep_going and while_count <= max_dig_depth do
local while_index = ai - area.ystride * while_count
local cur_y = y - while_count
if
(
data[while_index] == c_everness_mineral_stone
or data[while_index] == c_everness_mineral_stone_with_coal
or data[while_index] == c_everness_mineral_stone_with_ceramic_sherds
)
and is_valid_lake_node(data[while_index + 1 + area.ystride], x + 1, cur_y + 1, z)
and is_valid_lake_node(data[while_index - 1 + area.ystride], x - 1, cur_y + 1, z)
and is_valid_lake_node(data[while_index + area.zstride + area.ystride], x, cur_y + 1, z + 1)
and is_valid_lake_node(data[while_index - area.zstride + area.ystride], x, cur_y + 1, z - 1)
then
data[while_index + area.ystride] = c_everness_mineral_water_source
else
keep_going = false
end
while_count = while_count + 1
end
end
end
end
end
end
-- Place decorations after generating (2nd pass)
-- luacheck: ignore 512
for y = minp.y, maxp.y do
for z = minp.z, maxp.z do
for x = minp.x, maxp.x do
local ai = area:index(x, y, z)
--
-- Place Lotus Flowers and Leaves
--
if
data[ai] == c_everness_mineral_water_source
-- spawn around water
and data[ai + 1 + area.zstride] == c_everness_mineral_water_source
and data[ai + 1 - area.zstride] == c_everness_mineral_water_source
and data[ai + 1] == c_everness_mineral_water_source
and data[ai - 1] == c_everness_mineral_water_source
and data[ai - 1 + area.zstride] == c_everness_mineral_water_source
and data[ai - 1 - area.zstride] == c_everness_mineral_water_source
and data[ai + area.zstride] == c_everness_mineral_water_source
and data[ai - area.zstride] == c_everness_mineral_water_source
-- make sure there is space above
and data[ai + area.ystride] == core.CONTENT_AIR
-- spawn around air above
and data[ai + area.ystride + 1] == core.CONTENT_AIR
and data[ai + area.ystride + 1 + area.zstride] == core.CONTENT_AIR
and data[ai + area.ystride + 1 - area.zstride] == core.CONTENT_AIR
and data[ai + area.ystride - 1] == core.CONTENT_AIR
and data[ai + area.ystride - 1 + area.zstride] == core.CONTENT_AIR
and data[ai + area.ystride - 1 - area.zstride] == core.CONTENT_AIR
and data[ai + area.ystride + area.zstride] == core.CONTENT_AIR
and data[ai + area.ystride - area.zstride] == core.CONTENT_AIR
then
if rand:next(0, 100) < 2 then
data[ai + area.ystride] = c_lotus_flowers[rand:next(1, #c_lotus_flowers)]
-- Place Lotus Leaves around Flowers
local radius = 3
local chance_max = 80
for i = -radius, radius do
for j = -radius, radius do
local idx = ai + i + (area.zstride * j) + area.ystride
local distance = math.round(vector.distance(area:position(ai), area:position(idx)))
local chance_lotus_leaf = math.round(chance_max / distance)
if chance_lotus_leaf > chance_max then
chance_lotus_leaf = chance_max
end
if
rand:next(0, 100) < chance_lotus_leaf
and data[idx] == core.CONTENT_AIR
and data[idx - area.ystride] == c_everness_mineral_water_source
then
data[idx] = c_lotus_leaves[rand:next(1, #c_lotus_leaves)]
p2data[idx] = rand:next(0, 3)
end
end
end
elseif rand:next(0, 100) < 4 then
data[ai + area.ystride] = c_lotus_leaves[rand:next(1, #c_lotus_leaves)]
p2data[ai + area.ystride] = rand:next(0, 3)
-- add some more leaves around the leaf
for i = -1, 1 do
for j = -1, 1 do
local idx = ai + i + (area.zstride * j) + area.ystride
if
rand:next(0, 100) < 25
and data[idx] == core.CONTENT_AIR
and data[idx - area.ystride] == c_everness_mineral_water_source
then
data[idx] = c_lotus_leaves[rand:next(1, #c_lotus_leaves)]
p2data[idx] = rand:next(0, 3)
end
end
end
end
end
--
-- Place Seaweed
--
if
data[ai] == c_everness_mineral_water_source
and data[ai + area.ystride] == c_everness_mineral_water_source
and rand:next(0, 100) < 33
then
local c_weed = c_water_weeds[rand:next(1, #c_water_weeds)]
if rand:next(0, 100) < 5 then
-- Weed with light source with a bit less probability
c_weed = c_everness_mineral_water_weed_3
end
if data[ai + 1] == c_everness_mineral_stone then
data[ai + 1] = c_weed
data[ai + 1] = c_weed
data[ai + 1] = c_weed
p2data[ai + 1] = 2
elseif data[ai - 1] == c_everness_mineral_stone then
data[ai - 1] = c_weed
data[ai - 1] = c_weed
data[ai - 1] = c_weed
p2data[ai - 1] = 3
elseif data[ai + area.zstride] == c_everness_mineral_stone then
data[ai + area.zstride] = c_weed
data[ai + area.zstride] = c_weed
data[ai + area.zstride] = c_weed
p2data[ai + area.zstride] = 4
elseif data[ai - area.zstride] == c_everness_mineral_stone then
data[ai - area.zstride] = c_weed
data[ai - area.zstride] = c_weed
data[ai - area.zstride] = c_weed
p2data[ai - area.zstride] = 5
elseif data[ai - area.ystride] == c_everness_mineral_stone then
data[ai - area.ystride] = c_weed
data[ai - area.ystride] = c_weed
data[ai - area.ystride] = c_weed
p2data[ai - area.ystride] = 1
end
end
--
-- Place pots under water
--
if
data[ai] == c_everness_mineral_water_source
-- spawn around water
and data[ai + 1 + area.zstride] == c_everness_mineral_water_source
and data[ai + 1 - area.zstride] == c_everness_mineral_water_source
and data[ai + 1] == c_everness_mineral_water_source
and data[ai - 1] == c_everness_mineral_water_source
and data[ai - 1 + area.zstride] == c_everness_mineral_water_source
and data[ai - 1 - area.zstride] == c_everness_mineral_water_source
and data[ai + area.zstride] == c_everness_mineral_water_source
and data[ai - area.zstride] == c_everness_mineral_water_source
-- spawn around water above
and data[ai + area.ystride] == c_everness_mineral_water_source
and data[ai + area.ystride + 1] == c_everness_mineral_water_source
and data[ai + area.ystride + 1 + area.zstride] == c_everness_mineral_water_source
and data[ai + area.ystride + 1 - area.zstride] == c_everness_mineral_water_source
and data[ai + area.ystride - 1] == c_everness_mineral_water_source
and data[ai + area.ystride - 1 + area.zstride] == c_everness_mineral_water_source
and data[ai + area.ystride - 1 - area.zstride] == c_everness_mineral_water_source
and data[ai + area.ystride + area.zstride] == c_everness_mineral_water_source
and data[ai + area.ystride - area.zstride] == c_everness_mineral_water_source
-- spawn on solid node below
and data[ai - area.ystride] ~= c_everness_mineral_water_source
then
if rand:next(0, 100) < 1 then
table.insert(pot_pos, vector.new(area:position(ai)))
end
end
--
-- Surface Decorations on dry mineral sand (Rose Bush, Water Geyser, Pots)
--
if
data[ai] == c_everness_mineral_sand
and data[ai + area.ystride] == core.CONTENT_AIR
then
local r_val = rand:next(1, 1000)
if r_val <= 6 then
-- Rose Bush (needs air around)
if data[ai + area.ystride * 2] == core.CONTENT_AIR
and data[ai + 1 + area.ystride] == core.CONTENT_AIR
and data[ai - 1 + area.ystride] == core.CONTENT_AIR
and data[ai + area.zstride + area.ystride] == core.CONTENT_AIR
and data[ai - area.zstride + area.ystride] == core.CONTENT_AIR
then
data[ai + area.ystride] = c_everness_rose_bush
end
elseif r_val <= 9 then
-- Water Geyser (needs air around)
if data[ai + area.ystride * 2] == core.CONTENT_AIR
and data[ai + 1 + area.ystride] == core.CONTENT_AIR
and data[ai - 1 + area.ystride] == core.CONTENT_AIR
and data[ai + area.zstride + area.ystride] == core.CONTENT_AIR
and data[ai - area.zstride + area.ystride] == core.CONTENT_AIR
then
data[ai + area.ystride] = c_everness_water_geyser
end
elseif r_val <= 12 then
-- Ceramic Pots (above water on dry sand)
if data[ai + area.ystride * 2] == core.CONTENT_AIR then
data[ai + area.ystride] = c_pots[rand:next(1, #c_pots)]
end
end
end
end
end
end
-- Set `shared_args`
shared_args.chest_positions = chest_positions
shared_args.pot_pos = pot_pos
end,
after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args)
local sidelength = maxp.x - minp.x + 1
local x_disp = rand:next(0, disp)
local z_disp = rand:next(0, disp)
shared_args.schem_positions = {}
for y = minp.y, maxp.y do
local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp)
if data[vi + area.ystride] == core.CONTENT_AIR
and (
data[vi] == c_everness_mineral_water_source
or data[vi] == c_everness_mineral_sand
)
and rand:next(0, 100) < chance
then
local s_pos = area:position(vi)
--
-- Mineral Waters Tower
--
-- find floor big enough
local positions = core.find_nodes_in_area_under_air(
vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z),
{
'everness:mineral_sand',
'everness:mineral_water_source'
}
)
if #positions < size.x * size.z then
-- not enough space
return
end
-- enough air to place structure ?
local air_positions = core.find_nodes_in_area(
vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z),
vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z),
{
'air'
}
)
if #air_positions > (size.x * size.y * size.z) / 2 then
core.place_schematic_on_vmanip(
vm,
s_pos,
schem,
'random',
nil,
true,
'place_center_x, place_center_z'
)
shared_args.schem_positions.everness_mineral_waters_tower = shared_args.schem_positions.everness_mineral_waters_tower or {}
table.insert(shared_args.schem_positions.everness_mineral_waters_tower, {
pos = s_pos,
minp = vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z),
maxp = vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z)
})
core.log('action', '[Everness] Mineral Waters Tower was placed at ' .. s_pos:to_string())
end
end
end
--
-- Palm Trees (placed on dry mineral sand after pools & lakes)
--
local num_palms = rand:next(1, 33)
for _ = 1, num_palms do
local px = rand:next(minp.x + 3, maxp.x - 3)
local pz = rand:next(minp.z + 3, maxp.z - 3)
for py = maxp.y, minp.y, -1 do
local vi = area:index(px, py, pz)
local c_ground = data[vi]
if c_ground == c_everness_mineral_sand and data[vi + area.ystride] == core.CONTENT_AIR then
local p = vector.new(px, py + 1, pz)
local air_positions = core.find_nodes_in_area(
vector.new(p.x - 2, p.y, p.z - 2),
vector.new(p.x + 2, p.y + 6, p.z + 2),
{ 'air' }
)
if #air_positions >= 25 then
core.place_schematic_on_vmanip(
vm,
p,
core.get_modpath('everness') .. '/schematics/everness_palm_tree.mts',
'random',
nil,
true,
'place_center_x, place_center_z'
)
end
break
elseif c_ground ~= core.CONTENT_AIR and c_ground ~= core.CONTENT_IGNORE then
break
end
end
end
--
-- Pots (under water)
--
local pot_pos = shared_args.pot_pos or {}
for _, v in ipairs(pot_pos) do
vm:set_node_at(v, { name = core.get_name_from_content_id(c_pots[rand:next(1, #c_pots)]) })
end
end,
after_write_to_map = function(shared_args, gennotify, rand, minp, maxp)
-- Populate loot chest inventory
local chest_positions = shared_args.chest_positions or {}
if next(chest_positions) then
Everness:populate_loot_chests(chest_positions)
end
-- Populate loot chest inventory for schematics
local schem_positions = shared_args.schem_positions or {}
for name, tbl in pairs(schem_positions) do
if next(tbl) then
for i, v in ipairs(tbl) do
local chest_positions2 = core.find_nodes_in_area(
v.minp,
v.maxp,
{ 'everness:chest' }
)
if #chest_positions2 > 0 then
Everness:populate_loot_chests(chest_positions2)
end
end
end
end
-- Populate ceramic pot inventory
local pot_nodes = {
'everness:ceramic_pot_blank',
'everness:ceramic_pot_flowers',
'everness:ceramic_pot_lines',
'everness:ceramic_pot_tribal'
}
local pot_positions = (minp and maxp and core.find_nodes_in_area(minp, maxp, pot_nodes)) or {}
for _, p in ipairs(pot_positions) do
local meta = core.get_meta(p)
local inv = meta:get_inventory()
if not inv or inv:get_size('main') == 0 then
local n = core.get_node(p)
local ndef = core.registered_nodes[n.name]
if ndef and ndef.on_construct then
ndef.on_construct(p)
end
inv = meta:get_inventory()
end
if inv and inv:get_size('main') > 0 and inv:is_empty('main') then
local rand_idx = rand:next(1, #Everness.loot_chest.default)
local item_def = Everness.loot_chest.default[rand_idx]
if item_def and core.registered_items[item_def.name] then
if rand:next(0, 100) <= item_def.chance then
local stack = ItemStack(item_def.name)
if core.registered_tools[item_def.name] then
stack:set_wear(rand:next(1, 65535))
else
stack:set_count(rand:next(1, math.min(item_def.max_count, stack:get_stack_max())))
end
inv:set_stack('main', 1, stack)
end
end
end
end
end
})
@@ -0,0 +1,737 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--
-- Register biomes
--
local y_max = Everness.settings.biomes.everness_mineral_waters_under.y_max
local y_min = Everness.settings.biomes.everness_mineral_waters_under.y_min
-- Mineral Waters
Everness:register_biome({
name = 'everness:mineral_waters_under',
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',
y_max = y_max,
y_min = y_min,
vertical_blend = 16,
heat_point = 78,
humidity_point = 58,
})
--
-- Ores
--
core.register_on_mods_loaded(function()
local c_mapgen_stone = core.get_content_id('mapgen_stone')
local mapgen_stone_itemstring = core.get_name_from_content_id(c_mapgen_stone)
for name, def in pairs(core.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
wherein
and type(wherein) == 'table'
and table.indexof(wherein, mapgen_stone_itemstring) > -1
and not biomes
-- ignore ores that replace everything
and def.clust_scarcity ~= 1
then
-- prevent overriding orignal definition (breaks some mods)
def = table.copy(def)
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 = { 'everness:mineral_cave_stone' },
clust_scarcity = 16 * 16 * 16,
clust_size = 5,
y_max = y_max,
y_min = y_min,
noise_threshold = 0.0,
noise_params = {
offset = 0.5,
scale = 0.2,
spread = { x = 5, y = 5, z = 5 },
seed = 766,
octaves = 1,
persist = 0.0
},
biomes = { 'everness:mineral_waters_under' }
})
--
-- Register decorations
--
Everness:register_decoration({
name = 'everness:mineral_waters_under_floors',
deco_type = 'simple',
place_on = { 'everness:mineral_cave_stone' },
sidelen = 16,
place_offset_y = -1,
fill_ratio = 10,
biomes = { 'everness:mineral_waters_under' },
y_max = y_max,
y_min = y_min,
flags = 'all_floors, force_placement',
decoration = {
'everness:mineral_lava_stone'
},
})
--
-- Floors
--
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',
})
Everness:register_decoration({
name = 'everness:mineral_waters_under_lava_tree',
deco_type = 'simple',
place_on = {
'everness:mineral_lava_stone',
'everness:mineral_cave_stone',
'everness:mineral_lava_stone_with_moss'
},
sidelen = 16,
fill_ratio = 0.025,
biomes = { 'everness:mineral_waters_under' },
decoration = {
'everness:marker'
},
y_max = y_max,
y_min = y_min,
flags = 'all_floors',
})
--
-- Ceilings
--
Everness:register_decoration({
name = 'everness:mineral_waters_under_volcanic_spike_ceiling',
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' },
decoration = {
'everness:marker'
},
y_max = y_max,
y_min = y_min,
flags = 'all_ceilings',
})
--
-- On Generated
--
-- Get the content IDs for the nodes used
local c_everness_wall_vine_cave_cyan = core.get_content_id('everness:wall_vine_cave_cyan')
local c_everness_wall_vine_cave_violet = core.get_content_id('everness:wall_vine_cave_violet')
local c_everness_wall_vine_cave_blue = core.get_content_id('everness:wall_vine_cave_blue')
local c_everness_mineral_lava_stone = core.get_content_id('everness:mineral_lava_stone')
local c_everness_mineral_cave_stone = core.get_content_id('everness:mineral_cave_stone')
local c_everness_mineral_cave_cobblestone = core.get_content_id('everness:mineral_cave_cobblestone')
local c_everness_lava_source = core.get_content_id('everness:lava_source')
local c_everness_marker = core.get_content_id('everness:marker')
local c_everness_volcanic_rock = core.get_content_id('everness:volcanic_rock')
local c_everness_volcanic_spike_1 = core.get_content_id('everness:volcanic_spike_1')
local c_everness_volcanic_spike_2 = core.get_content_id('everness:volcanic_spike_2')
local c_everness_volcanic_spike_3 = core.get_content_id('everness:volcanic_spike_3')
local c_everness_volcanic_spike_4 = core.get_content_id('everness:volcanic_spike_4')
local c_everness_volcanic_spike_5 = core.get_content_id('everness:volcanic_spike_5')
local c_everness_volcanic_spike_6 = core.get_content_id('everness:volcanic_spike_6')
local c_everness_volcanic_spike_7 = core.get_content_id('everness:volcanic_spike_7')
local c_everness_mineral_cave_stone_spike_1 = core.get_content_id('everness:mineral_cave_stone_spike_1')
local c_everness_mineral_cave_stone_spike_2 = core.get_content_id('everness:mineral_cave_stone_spike_2')
local c_everness_mineral_cave_stone_spike_3 = core.get_content_id('everness:mineral_cave_stone_spike_3')
local c_everness_mineral_cave_stone_spike_4 = core.get_content_id('everness:mineral_cave_stone_spike_4')
local c_everness_mineral_cave_stone_spike_5 = core.get_content_id('everness:mineral_cave_stone_spike_5')
local c_everness_mineral_cave_stone_spike_6 = core.get_content_id('everness:mineral_cave_stone_spike_6')
local c_everness_mineral_cave_stone_spike_7 = core.get_content_id('everness:mineral_cave_stone_spike_7')
local c_everness_mineral_lava_stone_spike_1 = core.get_content_id('everness:mineral_lava_stone_spike_1')
local c_everness_mineral_lava_stone_spike_2 = core.get_content_id('everness:mineral_lava_stone_spike_2')
local c_everness_mineral_lava_stone_spike_3 = core.get_content_id('everness:mineral_lava_stone_spike_3')
local c_everness_mineral_lava_stone_spike_4 = core.get_content_id('everness:mineral_lava_stone_spike_4')
local c_everness_mineral_lava_stone_spike_5 = core.get_content_id('everness:mineral_lava_stone_spike_5')
local c_everness_mineral_lava_stone_spike_6 = core.get_content_id('everness:mineral_lava_stone_spike_6')
local c_everness_mineral_lava_stone_spike_7 = core.get_content_id('everness:mineral_lava_stone_spike_7')
local c_everness_mineral_lava_stone_with_moss = core.get_content_id('everness:mineral_lava_stone_with_moss')
-- Biome IDs
local biome_id_everness_mineral_waters_under = core.get_biome_id('everness:mineral_waters_under')
-- Decoration IDs
local d_everness_mineral_waters_under_volcanic_spike = core.get_decoration_id('everness:mineral_waters_under_volcanic_spike')
local d_everness_mineral_waters_under_volcanic_spike_ceiling = core.get_decoration_id('everness:mineral_waters_under_volcanic_spike_ceiling')
local d_everness_mineral_waters_under_lava_stone_spike = core.get_decoration_id('everness:mineral_waters_under_lava_stone_spike')
local d_everness_mineral_waters_under_lava_tree = core.get_decoration_id('everness:mineral_waters_under_lava_tree')
local volcanic_spike_place_on = Everness.to_set(core.registered_decorations['everness:mineral_waters_under_volcanic_spike'].place_on)
local volcanic_spike_ceiling_place_on = Everness.to_set(core.registered_decorations['everness:mineral_waters_under_volcanic_spike_ceiling'].place_on)
local lava_stone_spike_place_on = Everness.to_set(core.registered_decorations['everness:mineral_waters_under_lava_stone_spike'].place_on)
local lava_tree_place_on = Everness.to_set(core.registered_decorations['everness:mineral_waters_under_lava_tree'].place_on)
-- `core.read_schematic` here so we don't cache the schem file, otherwise `replacements` will not work
local schem_everness_lava_tree = core.read_schematic(core.get_modpath('everness') .. '/schematics/everness_lava_tree.mts', {})
local lava_tree_size = { x = 7, y = 13, z = 7 }
local lava_tree_size_x = math.round(lava_tree_size.x / 2)
local lava_tree_size_z = math.round(lava_tree_size.z / 2)
local lava_tree_safe_volume = lava_tree_size.x * lava_tree_size.y * lava_tree_size.z
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 cave_stone_spike_map = {
c_everness_mineral_cave_cobblestone,
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
}
local lava_stone_spike_map = {
c_everness_mineral_lava_stone,
c_everness_mineral_lava_stone_spike_1,
c_everness_mineral_lava_stone_spike_2,
c_everness_mineral_lava_stone_spike_3,
c_everness_mineral_lava_stone_spike_4,
c_everness_mineral_lava_stone_spike_5,
c_everness_mineral_lava_stone_spike_6,
c_everness_mineral_lava_stone_spike_7
}
Everness:register_gen_notify_decoration({
d_everness_mineral_waters_under_volcanic_spike,
d_everness_mineral_waters_under_lava_stone_spike,
d_everness_mineral_waters_under_volcanic_spike_ceiling,
d_everness_mineral_waters_under_lava_tree
})
Everness:add_to_queue_on_generated({
name = 'everness:mineral_waters_under',
can_run = function(biomemap, chunk_biomes)
return (chunk_biomes and chunk_biomes[biome_id_everness_mineral_waters_under]) or table.indexof(biomemap, biome_id_everness_mineral_waters_under) ~= -1
end,
-- 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)
local rand_version = rand:next(1, 2)
shared_args.rand_version = rand_version
if rand_version == 1 then
--
-- 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
else
for y = minp.y, maxp.y do
for z = minp.z, maxp.z do
for x = minp.x, maxp.x do
local ai = area:index(x, y, z)
if
data[ai] == c_everness_mineral_lava_stone
and data[ai + area.ystride] == core.CONTENT_AIR
and rand:next(0, 100) <= 10
then
local radius = 7
local chance_max = 80
for h = -3, 3 do
for i = -radius, radius do
for j = -radius, radius do
local idx = ai + i + (area.zstride * j) + (area.ystride * h)
local distance = math.round(vector.distance(area:position(ai), area:position(idx)))
local chance_moss = math.round(chance_max / distance)
if chance_moss > chance_max then
chance_moss = chance_max
end
if
data[idx] == c_everness_mineral_lava_stone
and rand:next(0, 100) < chance_moss
then
data[idx] = c_everness_mineral_lava_stone_with_moss
end
end
end
end
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
local vi = area:index(x, y, z)
if
data[vi] == core.CONTENT_AIR
and (
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) <= 15
then
-- 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] = core.dir_to_wallmounted(dir)
end
end
end
end
--
-- Spikes Floor
--
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 = core.get_name_from_content_id(data[idx])
if data[idx_marker] == c_everness_marker then
-- remove marker
data[idx_marker] = core.CONTENT_AIR
if volcanic_spike_place_on[place_on_node_name] 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),
{
core.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 = #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 = core.get_name_from_content_id(data[idx])
if data[idx_marker] == c_everness_marker then
-- remove marker
data[idx_marker] = core.CONTENT_AIR
if lava_stone_spike_place_on[place_on_node_name] 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),
{
core.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 = #cave_stone_spike_map - height + 1
local count = 0
for i = start_index, #cave_stone_spike_map do
data[idx_marker + area.ystride * count] = cave_stone_spike_map[i]
count = count + 1
end
end
end
end
end
--
-- Spikes Ceiling
--
for _, pos in ipairs(gennotify['decoration#' .. (d_everness_mineral_waters_under_volcanic_spike_ceiling or '')] or {}) do
local idx = area:indexp(pos)
local idx_marker = idx - area.ystride
local place_on_node_name = core.get_name_from_content_id(data[idx])
if data[idx_marker] == c_everness_marker then
-- remove marker
data[idx_marker] = core.CONTENT_AIR
-- data[idx_marker] = core.get_content_id('everness:pyrite_lantern')
if volcanic_spike_ceiling_place_on[place_on_node_name] then
local min_height = 3
local max_height = 16
local indexes = Everness.find_content_in_vm_area(
vector.new(pos.x, pos.y - max_height, pos.z),
vector.new(pos.x, pos.y - 1, pos.z),
{
core.CONTENT_AIR
},
data,
area
)
-- For smallest spike we need space above at least 3)
if #indexes > min_height then
local remainder = 0
local height = rand:next(min_height, #indexes)
if height > #lava_stone_spike_map then
remainder = height - #lava_stone_spike_map
height = height - remainder
end
local start_index = #lava_stone_spike_map - height + 1
local count = 0
if remainder > 0 then
for i = 1, remainder do
data[idx_marker - area.ystride * count] = c_everness_mineral_cave_cobblestone
count = count + 1
end
end
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`
-- therefore we are doing it after we set the data
after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args)
--
-- Lava Trees
--
for _, pos in ipairs(gennotify['decoration#' .. (d_everness_mineral_waters_under_lava_tree or '')] or {}) do
-- `pos` is position of the 'place_on' node
local marker_pos = vector.new(pos.x, pos.y + 1, pos.z)
local marker_node = core.get_node(marker_pos)
local place_on_node = core.get_node(pos)
if marker_node and marker_node.name == 'everness:marker' then
-- remove marker
core.remove_node(marker_pos)
if shared_args.rand_version ~= 1
and place_on_node
and lava_tree_place_on[place_on_node.name]
then
-- enough air to place structure ?
local positions = core.find_nodes_in_area(
vector.new(
pos.x - lava_tree_size_x,
pos.y,
pos.z - lava_tree_size_z
),
vector.new(
pos.x + lava_tree_size_x,
pos.y + lava_tree_size.y,
pos.z + lava_tree_size_z
),
{
'air',
'everness:lava_tree',
'everness:lava_tree_with_lava'
},
true
)
local air = positions.air or {}
local tree1 = positions['everness:lava_tree'] or {}
local tree2 = positions['everness:lava_tree_with_lava'] or {}
-- do not overlap another tree
if
#tree1 == 0
and #tree2 == 0
and #air > lava_tree_safe_volume
then
local replacements
if rand:next(0, 100) <= 25 then
replacements = {
['everness:lava_tree'] = 'everness:lava_tree_with_lava',
}
end
core.place_schematic_on_vmanip(
vm,
marker_pos,
schem_everness_lava_tree,
'random',
replacements,
false,
'place_center_x, place_center_z'
)
local grass_positions = core.find_nodes_in_area_under_air(
vector.subtract(marker_pos, { x = 3, y = 1, z = 3 }),
vector.add(marker_pos, { x = 3, y = 1, z = 3 }),
'everness:mineral_lava_stone_with_moss'
)
if #grass_positions > 1 then
for i = 1, rand:next(1, 3) do
local rand_p = grass_positions[rand:next(1, #grass_positions)]
if not vector.equals(marker_pos, rand_p) then
vm:set_node_at(vector.new(rand_p.x, rand_p.y + 1, rand_p.z), { name = 'everness:mineral_cave_moss_grass' })
end
end
end
end
end
end
end
end
})
+98
View File
@@ -0,0 +1,98 @@
everness_coral_forest = true
everness_coral_forest_y_max = 194
everness_coral_forest_y_min = 6
everness_coral_forest_dunes = true
everness_coral_forest_dunes_y_max = 5
everness_coral_forest_dunes_y_min = 4
everness_coral_forest_ocean = true
everness_coral_forest_ocean_y_max = 3
everness_coral_forest_ocean_y_min = -10
everness_coral_forest_deep_ocean = true
everness_coral_forest_deep_ocean_y_max = -11
everness_coral_forest_deep_ocean_y_min = -62
everness_coral_forest_under = true
everness_coral_forest_under_y_max = -28939
everness_coral_forest_under_y_min = -29067
everness_frosted_icesheet = true
everness_frosted_icesheet_y_max = 194
everness_frosted_icesheet_y_min = -8
everness_frosted_icesheet_ocean = true
everness_frosted_icesheet_ocean_y_max = -9
everness_frosted_icesheet_ocean_y_min = -62
everness_frosted_icesheet_under = true
everness_frosted_icesheet_under_y_max = -28939
everness_frosted_icesheet_under_y_min = -29067
everness_cursed_lands = true
everness_cursed_lands_y_max = 194
everness_cursed_lands_y_min = 6
everness_cursed_lands_dunes = true
everness_cursed_lands_dunes_y_max = 5
everness_cursed_lands_dunes_y_min = 1
everness_cursed_lands_swamp = true
everness_cursed_lands_swamp_y_max = 0
everness_cursed_lands_swamp_y_min = -1
everness_cursed_lands_ocean = true
everness_cursed_lands_ocean_y_max = -2
everness_cursed_lands_ocean_y_min = -10
everness_cursed_lands_deep_ocean = true
everness_cursed_lands_deep_ocean_y_max = -11
everness_cursed_lands_deep_ocean_y_min = -62
everness_cursed_lands_under = true
everness_cursed_lands_under_y_max = -28939
everness_cursed_lands_under_y_min = -29067
everness_crystal_forest = true
everness_crystal_forest_y_max = 194
everness_crystal_forest_y_min = 6
everness_crystal_forest_dunes = true
everness_crystal_forest_dunes_y_max = 5
everness_crystal_forest_dunes_y_min = 1
everness_crystal_forest_shore = true
everness_crystal_forest_shore_y_max = 0
everness_crystal_forest_shore_y_min = -1
everness_crystal_forest_ocean = true
everness_crystal_forest_ocean_y_max = 2
everness_crystal_forest_ocean_y_min = -10
everness_crystal_forest_deep_ocean = true
everness_crystal_forest_deep_ocean_y_max = -11
everness_crystal_forest_deep_ocean_y_min = -62
everness_crystal_forest_under = true
everness_crystal_forest_under_y_max = -28939
everness_crystal_forest_under_y_min = -29067
everness_bamboo_forest = true
everness_bamboo_forest_y_max = 194
everness_bamboo_forest_y_min = 1
everness_bamboo_forest_under = true
everness_bamboo_forest_under_y_max = -28939
everness_bamboo_forest_under_y_min = -29067
everness_forsaken_desert = true
everness_forsaken_desert_y_max = 194
everness_forsaken_desert_y_min = 4
everness_forsaken_desert_ocean = true
everness_forsaken_desert_ocean_y_max = 3
everness_forsaken_desert_ocean_y_min = -8
everness_forsaken_desert_under = true
everness_forsaken_desert_under_y_max = -28939
everness_forsaken_desert_under_y_min = -29067
everness_baobab_savanna = true
everness_baobab_savanna_y_max = 194
everness_baobab_savanna_y_min = 1
everness_forsaken_tundra = true
everness_forsaken_tundra_y_max = 194
everness_forsaken_tundra_y_min = 2
everness_forsaken_tundra_beach = true
everness_forsaken_tundra_beach_y_max = 1
everness_forsaken_tundra_beach_y_min = -3
everness_forsaken_tundra_ocean = true
everness_forsaken_tundra_ocean_y_max = -4
everness_forsaken_tundra_ocean_y_min = -15
everness_forsaken_tundra_under = true
everness_forsaken_tundra_under_y_max = -28939
everness_forsaken_tundra_under_y_min = -29067
everness_mineral_waters = true
everness_mineral_waters_y_max = 194
everness_mineral_waters_y_min = 1
everness_mineral_waters_under = true
everness_mineral_waters_under_y_max = -28939
everness_mineral_waters_under_y_min = -29067
everness_feature_sneak_pickup = false
everness_feature_skybox = true
+6
View File
@@ -0,0 +1,6 @@
name = everness
description = Never ending discovery in Everness mapgen.
depends =
optional_depends = default, xpanes, doors, stairs, walls, x_obsidianmese, x_tumbleweed, x_farming, x_clay, moreblocks, mcl_core, mcl_fences, mcl_walls, mcl_stairs, mcl_util, mcl_autogroup, _mcl_autogroup, mcl_doors, mcl_mapgen_core, mcl_panes, mcl_buckets, rp_default, i3, unified_inventory, sfinv
min_minetest_version = 5.9.0
supported_games = minetest_game, voxelibre, mineclonia, mineclone2
+359
View File
@@ -0,0 +1,359 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 SaKeL
mod_support_mcl total rewrite 2025 by Gunnar Zötl
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 = core.get_translator(core.get_current_modname())
local function register_alias(name, convert_to)
if not core.registered_aliases[name] and rawget(core.registered_items, name) == nil then
core.register_alias(name, convert_to)
core.registered_aliases[name] = convert_to
end
end
-- Test whether we are in VoxeLibre or Mineclonia
local isVL = core.get_modpath('vl_trusted') ~= nil
or core.get_modpath('vl_core') ~= nil
local mod_emu = {}
---
-- Fences / Gates
---
mod_emu.default = {
register_fence = function(name, def)
local sname = string.match(name, ':(.+)$')
local fence_id, gate_id, open_gate_id = mcl_fences.register_fence_and_fence_gate(
sname,
def.description,
def.description .. ' Gate',
def.texture,
{ handy = 1, axey = 1, flammable = 2, fence_wood = 1, fire_encouragement = 5, fire_flammability = 20 },
2,
15,
{ 'group:fence_wood' },
def.sounds
)
if fence_id == name then
register_alias('mcl_fences:' .. sname, name)
register_alias('mcl_fences:' .. sname .. '_gate', name .. '_gate')
register_alias('mcl_fences:' .. sname .. '_gate_open', name .. '_gate_open')
else
register_alias(name, fence_id)
if gate_id then register_alias(name .. '_gate', gate_id) end
if open_gate_id then register_alias(name .. '_gate_open', open_gate_id) end
end
end,
register_fence_rail = function(name, def)
local sname = string.match(name, ':(.+)$')
local fence_id = mcl_fences.register_fence_and_fence_gate(
sname,
def.description,
def.description .. ' Gate',
def.texture,
{ handy = 1, axey = 1, flammable = 2, fence_wood = 1, fire_encouragement = 5, fire_flammability = 20 },
2,
15,
{ 'group:fence_wood' },
def.sounds
)
if fence_id == name then
register_alias('mcl_fences:' .. sname, name)
else
register_alias(name, fence_id)
end
end,
register_mesepost = function(name, def)
-- Not applicable in MCL
end,
}
---
-- Walls
---
mod_emu.walls = {
register = function(name, desc, tex, mat, snd)
mcl_walls.register_wall(name, desc, mat, tex, nil, nil, snd)
end
}
---
-- Stairs and Slabs
---
mod_emu.stairs = {
register_stair_and_slab = function(base, mat, stat, tex, stairdesc, slabdesc, snd, bool)
local groups = {}
if stat.cracky then
-- In MTG: cracky 3 is softest, 1 is hardest.
-- In MCL: pickaxey 1 is wood, 2 is stone/iron, 3 is diamond.
groups.pickaxey = stat.cracky == 1 and 2 or 1
groups.material_stone = 1
groups.building_block = 1
elseif stat.choppy then
groups.axey = 1
groups.handy = 1
groups.wood = 1
groups.material_wood = 1
groups.building_block = 1
groups.flammable = stat.flammable or 2
groups.fire_encouragement = 5
groups.fire_flammability = 20
end
mcl_stairs.register_stair_and_slab(
base,
mat,
groups,
tex,
stairdesc,
slabdesc,
snd,
6,
2,
'Double ' .. slabdesc,
nil
)
register_alias('stairs:stair_' .. base, 'mcl_stairs:stair_' .. base)
register_alias('stairs:stair_inner_' .. base, 'mcl_stairs:stair_' .. base .. '_inner')
register_alias('stairs:stair_outer_' .. base, 'mcl_stairs:stair_' .. base .. '_outer')
register_alias('stairs:slab_' .. base, 'mcl_stairs:slab_' .. base)
end
}
---
-- Doors & Trapdoors
---
mod_emu.doors = {
register = function(name, def)
local sname = string.match(name, ':(.+)$')
local modpath = core.get_modpath(core.get_current_modname())
local utex = io.open(modpath .. '/textures/everness_mcl_doors_' .. sname .. '_lower.png', 'r')
if not utex then
core.log('warning', '[everness] mod_support_mcl not registering door type ' .. name .. ' because of missing textures')
return
end
utex:close()
local newdef = {
description = def.description,
inventory_image = def.inventory_image,
groups = { handy = 1, axey = 1, material_wood = 1, flammable = -1 },
sounds = def.sounds,
sound_open = def.sound_open,
sound_close = def.sound_close,
_mcl_hardness = 3,
_mcl_blast_resistance = 3,
}
if isVL then
newdef.tiles_bottom = 'everness_mcl_doors_' .. sname .. '_lower.png'
newdef.tiles_top = 'everness_mcl_doors_' .. sname .. '_upper.png'
else
newdef.tiles_bottom = {
'everness_mcl_doors_' .. sname .. '_lower.png^[transformFX',
'everness_mcl_doors_' .. sname .. '_lower_side.png'
}
newdef.tiles_top = {
'everness_mcl_doors_' .. sname .. '_upper.png^[transformFX',
'everness_mcl_doors_' .. sname .. '_upper_side.png'
}
end
mcl_doors:register_door(name, newdef)
-- Register aliases for MTG door nodes (_a bottom, _b top) used in schematics
register_alias(name .. '_a', name .. '_b_1')
register_alias(name .. '_b', name .. '_t_1')
if def.recipe then
core.register_craft({
output = name .. ' 3',
recipe = def.recipe
})
end
end,
register_trapdoor = function(name, def)
mcl_doors:register_trapdoor(name, {
description = def.description,
inventory_image = def.inventory_image,
tile_front = def.tile_front,
tile_side = def.tile_side,
wield_image = def.wield_image,
groups = { handy = 1, axey = 1, material_wood = 1, flammable = -1 },
sounds = def.sounds,
sound_open = def.sound_open,
sound_close = def.sound_close,
_mcl_hardness = 3,
_mcl_blast_resistance = 3,
})
if def.recipe then
core.register_craft({
output = name,
recipe = def.recipe
})
end
end,
register_fencegate = function(name, def)
local gate_name_map = {
['everness:gate_bamboo'] = 'everness:fence_bamboo_wood_gate',
['everness:gate_crystal_wood'] = 'everness:fence_crystal_wood_gate',
['everness:gate_palm_wood'] = 'everness:fence_palm_wood_gate',
['everness:gate_coral_wood'] = 'everness:fence_coral_wood_gate',
['everness:gate_lava_tree_wood'] = 'everness:fence_lava_tree_wood_gate',
}
if gate_name_map[name] then
register_alias(name, gate_name_map[name])
register_alias(name .. '_open', gate_name_map[name] .. '_open')
end
end
}
---
-- Buckets
---
if core.global_exists('mcl_buckets') and mcl_buckets.register_liquid then
mcl_buckets.register_liquid({
source_place = 'everness:mineral_water_source',
source_take = { 'everness:mineral_water_source' },
bucketname = 'everness:bucket_mineral_water',
inventory_image = 'everness_mcl_bucket_mineral_water.png',
name = S('Mineral') .. ' ' .. S('Water') .. ' ' .. S('Bucket'),
longdesc = S('A bucket can be used to collect and release liquids. This one is filled with mineral water.'),
usagehelp = S('Place it to empty the bucket and create a mineral water source.'),
tt_help = S('Places a mineral water source'),
groups = { water_bucket = 1 },
})
end
---
-- Panes
---
if not (core.global_exists('xpanes') and xpanes.register_pane) then
mod_emu.xpanes = {
register_pane = function(name, def)
if core.global_exists('mcl_panes') and mcl_panes.register_pane then
local mcl_def = table.copy(def)
if mcl_def.textures then
local t1 = mcl_def.textures[1] or ''
local t2 = (mcl_def.textures[2] and mcl_def.textures[2] ~= '') and mcl_def.textures[2] or t1
local t3 = mcl_def.textures[3] or t1
mcl_def.textures = { t1, t2, t3 }
end
mcl_panes.register_pane(name, mcl_def)
end
register_alias('xpanes:' .. name, 'mcl_panes:' .. name)
register_alias('xpanes:' .. name .. '_flat', 'mcl_panes:' .. name .. '_flat')
end
}
else
register_alias('mcl_panes:cursed_bar', 'xpanes:cursed_bar')
register_alias('mcl_panes:cursed_bar_flat', 'xpanes:cursed_bar_flat')
register_alias('mcl_panes:pyrite_pane', 'xpanes:pyrite_pane')
register_alias('mcl_panes:pyrite_pane_flat', 'xpanes:pyrite_pane_flat')
end
---
-- Scoped Execution Runner
---
local function load_derivative_nodes()
local prev_default = rawget(_G, 'default')
local prev_walls = rawget(_G, 'walls')
local prev_stairs = rawget(_G, 'stairs')
local prev_doors = rawget(_G, 'doors')
local prev_xpanes = rawget(_G, 'xpanes')
rawset(_G, 'default', mod_emu.default)
rawset(_G, 'walls', mod_emu.walls)
rawset(_G, 'stairs', mod_emu.stairs)
rawset(_G, 'doors', mod_emu.doors)
if mod_emu.xpanes then
rawset(_G, 'xpanes', mod_emu.xpanes)
end
local path = core.get_modpath('everness')
dofile(path .. '/panes.lua')
dofile(path .. '/stairs.lua')
dofile(path .. '/walls.lua')
dofile(path .. '/fences.lua')
dofile(path .. '/doors.lua')
rawset(_G, 'default', prev_default)
rawset(_G, 'walls', prev_walls)
rawset(_G, 'stairs', prev_stairs)
rawset(_G, 'doors', prev_doors)
if mod_emu.xpanes then
rawset(_G, 'xpanes', prev_xpanes)
end
end
load_derivative_nodes()
---
-- Trees & Leafdecay Compatibility with Mineclonia
---
-- In Mineclonia, mcl_trees overrides on_construct and after_destruct on all nodes
-- with group:tree ~= 0 in an on_mods_loaded callback.
-- This triggers heavy VoxelManip updates (reading/writing an 8-block radius) and
-- massive 15,625-node area searches whenever an Everness tree log is dug or placed.
-- Because Everness leaves do not use Mineclonia's distance param2 leafdecay,
-- mcl_trees's callbacks do no useful work on Everness trees while causing severe lag,
-- massive Lua memory allocations (~500 KB per log), and server OOM crashes on large trees.
--
-- Since everness is loaded after mcl_trees, this on_mods_loaded callback executes after
-- mcl_trees's on_mods_loaded, cleanly restoring Everness's own lightweight leafdecay.
core.register_on_mods_loaded(function()
if not core.get_modpath('mcl_trees') then
return
end
if Everness.leafdecay_trunk_defs then
for trunk, def in pairs(Everness.leafdecay_trunk_defs) do
if core.registered_nodes[trunk] then
core.registered_nodes[trunk].on_construct = nil
if core.registered_items[trunk] then
core.registered_items[trunk].on_construct = nil
end
core.override_item(trunk, {
after_destruct = function(pos, oldnode)
Everness.leafdecay_after_destruct(pos, oldnode, def)
end,
})
end
end
end
-- Also handle other Everness trunks that do not have leafdecay (e.g. hollow_tree)
if core.registered_nodes['everness:hollow_tree'] then
core.registered_nodes['everness:hollow_tree'].on_construct = nil
core.registered_nodes['everness:hollow_tree'].after_destruct = nil
if core.registered_items['everness:hollow_tree'] then
core.registered_items['everness:hollow_tree'].on_construct = nil
core.registered_items['everness:hollow_tree'].after_destruct = nil
end
end
end)
Binary file not shown.
+215
View File
@@ -0,0 +1,215 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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 function register_alias(name, convert_to)
if rawget(core.registered_items, name) ~= nil then
return
end
local existing = core.registered_aliases[name]
if not existing then
core.register_alias(name, convert_to)
core.registered_aliases[name] = convert_to
elseif existing ~= convert_to and rawget(core.registered_items, existing) == nil then
core.register_alias_force(name, convert_to)
core.registered_aliases[name] = convert_to
end
end
register_alias('mapgen_water_source', 'mcl_core:water_source')
register_alias('default:water_source', 'mcl_core:water_source')
register_alias('default:water_flowing', 'mcl_core:water_flowing')
register_alias('default:dirt', 'mcl_core:dirt')
register_alias('default:dirt_with_rainforest_litter', 'mcl_core:dirt_with_grass')
register_alias('default:dirt_with_snow', 'mcl_core:dirt_with_grass_snow')
register_alias('default:dirt_with_coniferous_litter', 'mcl_core:podzol')
register_alias('default:dirt_with_grass', 'mcl_core:dirt_with_grass')
register_alias('default:permafrost_with_moss', 'mcl_core:dirt_with_grass')
register_alias('default:permafrost_with_stones', 'mcl_core:coarse_dirt')
register_alias('default:stick', 'mcl_core:stick')
register_alias('default:paper', 'mcl_core:paper')
register_alias('default:book', 'mcl_books:book')
register_alias('default:skeleton_key', 'mcl_core:gold_nugget')
register_alias('default:flint', 'mcl_core:flint')
register_alias('default:obsidian_shard', 'mcl_core:prismarine_shard')
register_alias('default:clay_brick', 'mcl_core:brick')
register_alias('default:mese_crystal_fragment', 'mcl_amethyst:amethyst_shard')
-- Ingots
register_alias('default:gold_ingot', 'mcl_core:gold_ingot')
register_alias('default:bronze_ingot', 'mcl_copper:copper_ingot')
register_alias('default:tin_ingot', 'mcl_core:iron_ingot')
register_alias('default:copper_ingot', 'mcl_copper:copper_ingot')
register_alias('default:steel_ingot', 'mcl_core:iron_ingot')
register_alias('default:coal_lump', 'mcl_core:coal_lump')
-- Tools
register_alias('default:pick_stone', 'mcl_tools:pick_stone')
register_alias('default:pick_bronze', 'mcl_tools:pick_gold')
register_alias('default:pick_steel', 'mcl_tools:pick_iron')
register_alias('default:shovel_stone', 'mcl_tools:shovel_stone')
register_alias('default:shovel_bronze', 'mcl_tools:shovel_gold')
register_alias('default:shovel_steel', 'mcl_tools:shovel_iron')
register_alias('default:axe_stone', 'mcl_tools:axe_stone')
register_alias('default:axe_bronze', 'mcl_tools:axe_gold')
register_alias('default:axe_steel', 'mcl_tools:axe_iron')
register_alias('default:sword_stone', 'mcl_tools:sword_stone')
register_alias('default:sword_bronze', 'mcl_tools:sword_gold')
register_alias('default:sword_steel', 'mcl_tools:sword_iron')
-- Items / Nodes
register_alias('default:bookshelf', 'mcl_books:bookshelf')
register_alias('default:sign_wall_wood', 'mcl_signs:wall_sign')
register_alias('default:ladder_wood', 'mcl_core:ladder')
register_alias('default:ladder_steel', 'mcl_core:ladder')
register_alias('default:glass', 'mcl_core:glass')
register_alias('default:obsidian_glass', 'mcl_core:glass')
-- Trees
register_alias('default:tree', 'mcl_core:tree')
register_alias('default:jungletree', 'mcl_core:jungletree')
register_alias('default:pine_tree', 'mcl_core:sprucetree')
register_alias('default:cactus', 'mcl_core:cactus')
register_alias('default:large_cactus_seedling', 'mcl_core:cactus')
register_alias('default:papyrus', 'mcl_core:reeds')
register_alias('default:junglegrass', 'mcl_flowers:double_grass')
register_alias('default:blueberry_bush_sapling', 'mcl_flowers:rose_bush')
register_alias('default:sapling', 'mcl_core:sapling')
register_alias('default:junglesapling', 'mcl_core:junglesapling')
register_alias('default:pine_sapling', 'mcl_core:sprucesapling')
register_alias('default:acacia_sapling', 'mcl_core:acaciasapling')
register_alias('default:aspen_sapling', 'mcl_core:birchsapling')
register_alias('default:clay_lump', 'mcl_core:clay_lump')
register_alias('default:tin_lump', 'mcl_raw_ores:raw_gold')
register_alias('default:copper_lump', 'mcl_copper:raw_copper')
register_alias('default:iron_lump', 'mcl_raw_ores:raw_iron')
register_alias('default:coalblock', 'mcl_core:coalblock')
register_alias('default:steelblock', 'mcl_core:ironblock')
register_alias('default:copperblock', 'mcl_copper:block')
register_alias('default:tinblock', 'mcl_core:goldblock')
register_alias('default:bronzeblock', 'mcl_copper:block')
register_alias('default:mese', 'mesecons_torch:redstoneblock')
register_alias('default:meselamp', 'mesecons_lightstone:lightstone_off')
register_alias('default:obsidian', 'mcl_core:obsidian')
register_alias('default:mese_crystal', 'mcl_ocean:prismarine_crystals')
register_alias('default:diamond', 'mcl_core:diamond')
register_alias('default:pick_mese', 'mcl_tools:pick_diamond')
register_alias('default:shovel_mese', 'mcl_tools:shovel_diamond')
register_alias('default:axe_mese', 'mcl_tools:axe_diamond')
register_alias('default:sword_mese', 'mcl_tools:sword_diamond')
register_alias('default:tnt', 'mcl_tnt:tnt')
register_alias('default:snowblock', 'mcl_core:snowblock')
register_alias('default:ice', 'mcl_core:ice')
register_alias('default:torch', 'mcl_torches:torch')
register_alias('default:cobble', 'mcl_core:cobble')
register_alias('default:chest', 'mcl_chests:chest')
register_alias('default:snow', 'mcl_core:snow')
register_alias('default:stone', 'mcl_core:stone')
register_alias('default:sand', 'mcl_core:sand')
register_alias('default:desert_sand', 'mcl_core:sand')
register_alias('default:silver_sand', 'mcl_core:sand')
register_alias('default:gravel', 'mcl_core:gravel')
register_alias('default:stone_with_coal', 'mcl_core:stone_with_coal')
register_alias('default:stone_with_iron', 'mcl_core:stone_with_iron')
register_alias('default:stone_with_copper', 'mcl_copper:stone_with_copper')
register_alias('default:stone_with_tin', 'mcl_copper:stone_with_copper')
register_alias('default:stone_with_gold', 'mcl_core:stone_with_gold')
register_alias('default:stone_with_mese', 'mcl_core:stone_with_redstone')
register_alias('default:stone_with_diamond', 'mcl_core:stone_with_diamond')
register_alias('mapgen_lava_source', 'mcl_core:lava_source')
register_alias('default:lava_source', 'mcl_core:lava_source')
register_alias('default:mossycobble', 'mcl_core:mossycobble')
register_alias('default:clay', 'mcl_colorblocks:hardened_clay')
register_alias('default:dry_dirt_with_dry_grass', 'mcl_core:dirt_with_grass')
register_alias('default:dry_dirt', 'mcl_core:coarse_dirt')
register_alias('default:coral_skeleton', 'mcl_core:bone_block')
register_alias('default:lava_flowing', 'mcl_core:lava_flowing')
register_alias('default:fence_wood', 'mcl_fences:fence')
register_alias('default:torch_wall', 'mcl_torches:torch_wall')
register_alias('default:wood', 'mcl_core:wood')
register_alias('default:junglewood', 'mcl_core:junglewood')
register_alias('default:pine_wood', 'mcl_core:sprucewood')
register_alias('default:mese_post_light_pine_wood', 'mcl_torches:torch')
if not core.registered_items['default:acacia_tree'] then
core.register_alias_force('default:acacia_tree', 'mcl_core:acaciatree')
end
register_alias('default:dry_grass_4', 'mcl_core:deadbush')
register_alias('default:dry_grass_2', 'mcl_core:deadbush')
register_alias('default:dry_shrub', 'mcl_core:deadbush')
register_alias('default:stonebrick', 'mcl_core:stonebrick')
register_alias('default:jungleleaves', 'mcl_core:jungleleaves')
register_alias('default:torch_ceiling', 'mcl_torches:torch_wall')
register_alias('default:goldblock', 'mcl_core:goldblock')
-- Common MTG Stairs and Slabs (registered if not already handled by game)
register_alias('stairs:stair_junglewood', 'mcl_stairs:stair_junglewood')
register_alias('stairs:slab_junglewood', 'mcl_stairs:slab_junglewood')
register_alias('stairs:stair_wood', 'mcl_stairs:stair_wood')
register_alias('stairs:slab_wood', 'mcl_stairs:slab_wood')
register_alias('stairs:stair_inner_wood', 'mcl_stairs:stair_wood_inner')
register_alias('stairs:stair_outer_wood', 'mcl_stairs:stair_wood_outer')
register_alias('stairs:stair_stonebrick', 'mcl_stairs:stair_stonebrick')
register_alias('stairs:slab_stonebrick', 'mcl_stairs:slab_stonebrick')
register_alias('stairs:stair_inner_stonebrick', 'mcl_stairs:stair_stonebrick_inner')
register_alias('stairs:stair_outer_stonebrick', 'mcl_stairs:stair_stonebrick_outer')
register_alias('stairs:stair_mossycobble', 'mcl_stairs:stair_mossycobble')
register_alias('stairs:slab_mossycobble', 'mcl_stairs:slab_mossycobble')
-- Walls backwards compatibility (old map data without underscores -> new registered wall names)
register_alias('everness:cursedbrickwall', 'everness:cursed_brick_wall')
register_alias('everness:cursedbrickwithgrowthwall', 'everness:cursed_brick_with_growth_wall')
register_alias('everness:coraldesertcobblewall', 'everness:coral_desert_cobble_wall')
register_alias('everness:coraldesertmossycobblewall', 'everness:coral_desert_mossy_cobble_wall')
register_alias('everness:forsakentundrabrickwall', 'everness:forsaken_tundra_brick_wall')
register_alias('everness:forsakentundracobblewall', 'everness:forsaken_tundra_cobble_wall')
register_alias('everness:forsakentundrastonewall', 'everness:forsaken_tundra_stone_wall')
register_alias('walls:cobble', 'mcl_walls:cobble')
-- Doors & Trapdoors
register_alias('xpanes:trapdoor_steel_bar', 'mcl_doors:iron_trapdoor')
register_alias('doors:trapdoor_open', 'mcl_doors:trapdoor_open')
register_alias('doors:trapdoor', 'mcl_doors:trapdoor')
register_alias('doors:door_wood', 'mcl_doors:wooden_door')
register_alias('doors:door_wood_a', 'mcl_doors:wooden_door_b_1')
register_alias('doors:door_wood_b', 'mcl_doors:wooden_door_t_1')
register_alias('doors:hidden', 'air')
register_alias('everness:cobweb', 'mcl_core:cobweb')
-- Fence Gates
register_alias('everness:gate_bamboo', 'everness:fence_bamboo_wood_gate')
register_alias('everness:gate_bamboo_open', 'everness:fence_bamboo_wood_gate_open')
register_alias('everness:gate_crystal_wood', 'everness:fence_crystal_wood_gate')
register_alias('everness:gate_crystal_wood_open', 'everness:fence_crystal_wood_gate_open')
register_alias('everness:gate_palm_wood', 'everness:fence_palm_wood_gate')
register_alias('everness:gate_palm_wood_open', 'everness:fence_palm_wood_gate_open')
register_alias('everness:gate_coral_wood', 'everness:fence_coral_wood_gate')
register_alias('everness:gate_coral_wood_open', 'everness:fence_coral_wood_gate_open')
register_alias('everness:gate_lava_tree_wood', 'everness:fence_lava_tree_wood_gate')
register_alias('everness:gate_lava_tree_wood_open', 'everness:fence_lava_tree_wood_gate_open')
-- Legacy flowers - replaced by everness:flowers_*
register_alias('flowers:rose', 'mcl_flowers:wither_rose')
register_alias('flowers:tulip', 'mcl_flowers:tulip_orange')
register_alias('flowers:dandelion_yellow', 'mcl_flowers:dandelion')
register_alias('flowers:geranium', 'mcl_flowers:allium')
register_alias('flowers:viola', 'mcl_flowers:azure_bluet')
register_alias('flowers:tulip_black', 'mcl_flowers:tulip_white')
register_alias('flowers:dandelion_white', 'mcl_flowers:tulip_pink')
register_alias('flowers:chrysanthemum_green', 'mcl_flowers:tulip_white')
-- Schematics compatibility
register_alias('butterflies:butterfly_violet', 'air')
+228
View File
@@ -0,0 +1,228 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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 = core.get_translator(core.get_current_modname())
---
-- Helper: Adapt world-aligned textures for mesh nodes (slopes)
--
-- In Luanti, solid nodes and nodeboxes support `align_style = "world"` and
-- `scale = N` natively. However, More Blocks slopes use `drawtype = "mesh"`
-- (.obj meshes), where the engine does not support world alignment and instead
-- stretches the entire multi-block texture into the 0..1 UV coordinates of the
-- mesh face. For mesh nodes, we detect world-aligned textures and crop a single
-- 1-node tile so the slope displays a properly proportioned texture.
---
local function adapt_tiles_for_slopes(tiles, recipeitem)
if not tiles and recipeitem and core.registered_nodes[recipeitem] then
tiles = core.registered_nodes[recipeitem].tiles
end
if not tiles then return nil end
local new_tiles = {}
local has_world_aligned = false
for i, t in ipairs(tiles) do
local tile_def = t
if type(tile_def) == 'string' and recipeitem and core.registered_nodes[recipeitem] then
local src_tiles = core.registered_nodes[recipeitem].tiles
if src_tiles and src_tiles[i] and type(src_tiles[i]) == 'table' then
tile_def = src_tiles[i]
end
end
if type(tile_def) == 'table' and tile_def.align_style == 'world' and tile_def.scale and tile_def.scale > 1 then
has_world_aligned = true
local tile_name = tile_def.name
local cropped_name
if tile_def.animation then
-- For animated multi-block textures (e.g. scale = 8 with vertical_frames),
-- crop a 16x16 tile using [combine to extract a clean 16x16 frame.
cropped_name = '[combine:16x16:0,0=' .. tile_name
else
-- For static textures (scale = 2, 4, etc.), ^[sheet:SxS:0,0 cleanly crops
-- a 1-node tile (0,0) and respects any texture pack resolution.
cropped_name = tile_name .. '^[sheet:' .. tile_def.scale .. 'x' .. tile_def.scale .. ':0,0'
end
new_tiles[i] = {
name = cropped_name,
backface_culling = tile_def.backface_culling,
}
else
new_tiles[i] = t
end
end
if has_world_aligned then
return new_tiles
end
return tiles
end
---
-- Helper: Register all Stairs+ shapes with slope-adapted textures
---
local function register_stairsplus(modname, subname, recipeitem, fields)
local slope_tiles = adapt_tiles_for_slopes(fields.tiles, recipeitem)
if slope_tiles ~= fields.tiles then
-- Nodeboxes (stairs, slabs, panels, microblocks) support world-aligned textures natively
stairsplus:register_stair(modname, subname, recipeitem, fields)
stairsplus:register_slab(modname, subname, recipeitem, fields)
stairsplus:register_panel(modname, subname, recipeitem, fields)
stairsplus:register_micro(modname, subname, recipeitem, fields)
-- Slopes are .obj meshes which do not support world-aligned textures in the engine;
-- use the cropped 16x16 tiles so textures are not squished onto the mesh
local slope_fields = table.copy(fields)
slope_fields.tiles = slope_tiles
stairsplus:register_slope(modname, subname, recipeitem, slope_fields)
else
stairsplus:register_all(modname, subname, recipeitem, fields)
end
end
---
-- Stairs+ / More Blocks Circular Saw Scoped Adapter
---
local moreblocks_emu_stairs = {
register_stair_and_slab = function(subname, recipeitem, groups, images, desc_stair, desc_slab, sounds, worldaligntex)
-- Strip translation escape sequences (\027%b() and \027.) to avoid malformed double-translation
local clean_desc = desc_stair:gsub('\027%b()', ''):gsub('\027.', '')
local base_desc = clean_desc:gsub('%s+[Ss]tair$', '')
register_stairsplus('everness', subname, recipeitem, {
description = S(base_desc),
tiles = images,
groups = groups,
sounds = sounds,
})
-- Backwards compatibility aliases for schematics, previous worlds, and crafts
core.register_alias_force('stairs:stair_' .. subname, 'everness:stair_' .. subname)
core.register_alias_force('stairs:stair_inner_' .. subname, 'everness:stair_' .. subname .. '_inner')
core.register_alias_force('stairs:stair_outer_' .. subname, 'everness:stair_' .. subname .. '_outer')
core.register_alias_force('stairs:slab_' .. subname, 'everness:slab_' .. subname)
end
}
-- Execute stairs.lua under the Scoped Adapter
local prev_stairs = rawget(_G, 'stairs')
rawset(_G, 'stairs', moreblocks_emu_stairs)
local path = core.get_modpath('everness')
dofile(path .. '/stairs.lua')
rawset(_G, 'stairs', prev_stairs)
---
-- Additional Everness building blocks for Circular Saw
---
local extra_nodes = {
-- Tree Trunks
{ subname = 'coral_tree', recipeitem = 'everness:coral_tree', desc = 'Coral Tree Trunk' },
{ subname = 'coral_tree_bioluminescent', recipeitem = 'everness:coral_tree_bioluminescent', desc = 'Coral Tree Bioluminescent Trunk' },
{ subname = 'baobab_tree', recipeitem = 'everness:baobab_tree', desc = 'Baobab Tree Trunk' },
{ subname = 'sequoia_tree', recipeitem = 'everness:sequoia_tree', desc = 'Sequoia Tree Trunk' },
{ subname = 'willow_tree', recipeitem = 'everness:willow_tree', desc = 'Willow Tree Trunk' },
{ subname = 'hollow_tree', recipeitem = 'everness:hollow_tree', desc = 'Hollow Tree Trunk' },
{ subname = 'crystal_tree', recipeitem = 'everness:crystal_tree', desc = 'Crystal Tree Trunk' },
{ subname = 'mese_tree', recipeitem = 'everness:mese_tree', desc = 'Mese Tree Trunk' },
{ subname = 'palm_tree', recipeitem = 'everness:palm_tree', desc = 'Palm Tree Trunk' },
{ subname = 'lava_tree', recipeitem = 'everness:lava_tree', desc = 'Lava Tree Trunk' },
{ subname = 'lava_tree_with_lava', recipeitem = 'everness:lava_tree_with_lava', desc = 'Lava Tree Trunk with Lava Veins' },
-- Bamboo blocks
{ subname = 'bamboo_block', recipeitem = 'everness:bamboo_block', desc = 'Bamboo Block' },
{ subname = 'bamboo_dry_block', recipeitem = 'everness:bamboo_dry_block', desc = 'Dry Bamboo Block' },
-- Cursed blocks
{ subname = 'cursed_stone', recipeitem = 'everness:cursed_stone', desc = 'Cursed Stone' },
{ subname = 'cursed_brick_mixed', recipeitem = 'everness:cursed_brick_mixed', desc = 'Cursed Brick Mixed' },
{ subname = 'cursed_brick_carved', recipeitem = 'everness:cursed_brick_carved', desc = 'Cursed Brick Carved' },
{ subname = 'cursed_dream_stone', recipeitem = 'everness:cursed_dream_stone', desc = 'Cursed Dream Stone' },
-- Crystal blocks
{ subname = 'crystal_stone', recipeitem = 'everness:crystal_stone', desc = 'Crystal Stone' },
{ subname = 'crystal_sandstone', recipeitem = 'everness:crystal_sandstone', desc = 'Crystal Sandstone' },
{ subname = 'crystal_sandstone_brick', recipeitem = 'everness:crystal_sandstone_brick', desc = 'Crystal Sandstone Brick' },
{ subname = 'crystal_sandstone_chiseled', recipeitem = 'everness:crystal_sandstone_chiseled', desc = 'Crystal Sandstone Chiseled' },
{ subname = 'crystal_block_cyan', recipeitem = 'everness:crystal_block_cyan', desc = 'Cyan Crystal Block' },
{ subname = 'crystal_block_orange', recipeitem = 'everness:crystal_block_orange', desc = 'Orange Crystal Block' },
{ subname = 'crystal_block_purple', recipeitem = 'everness:crystal_block_purple', desc = 'Purple Crystal Block' },
-- Forsaken blocks
{ subname = 'forsaken_desert_stone', recipeitem = 'everness:forsaken_desert_stone', desc = 'Forsaken Desert Stone' },
{ subname = 'forsaken_tundra_rocks', recipeitem = 'everness:forsaken_tundra_rocks', desc = 'Forsaken Tundra Rocks' },
-- Pyrite blocks
{ subname = 'pyriteblock', recipeitem = 'everness:pyriteblock', desc = 'Pyrite Block' },
{ subname = 'pyriteblock_brick', recipeitem = 'everness:pyriteblock_brick', desc = 'Pyrite Brick' },
{ subname = 'pyriteblock_forged', recipeitem = 'everness:pyriteblock_forged', desc = 'Forged Pyrite Block' },
{ subname = 'pyriteblock_polished', recipeitem = 'everness:pyriteblock_polished', desc = 'Polished Pyrite Block' },
{ subname = 'pyriteblock_spiral', recipeitem = 'everness:pyriteblock_spiral', desc = 'Pyrite Spiral' },
{ subname = 'pyriteblock_slab_brick', recipeitem = 'everness:pyriteblock_slab_brick', desc = 'Pyrite Slab Brick' },
-- Ice & Snow blocks
{ subname = 'ancient_emerald_ice', recipeitem = 'everness:ancient_emerald_ice', desc = 'Ancient Emerald Ice' },
{ subname = 'dense_emerald_ice', recipeitem = 'everness:dense_emerald_ice', desc = 'Dense Emerald Ice' },
{ subname = 'emerald_ice', recipeitem = 'everness:emerald_ice', desc = 'Emerald Ice' },
{ subname = 'frosted_ice', recipeitem = 'everness:frosted_ice', desc = 'Frosted Ice' },
{ subname = 'frosted_ice_translucent', recipeitem = 'everness:frosted_ice_translucent', desc = 'Frosted Ice Translucent' },
{ subname = 'frosted_snowblock', recipeitem = 'everness:frosted_snowblock', desc = 'Frosted Snow Block' },
{ subname = 'icecobble', recipeitem = 'everness:icecobble', desc = 'Ice Cobble' },
{ subname = 'snowcobble', recipeitem = 'everness:snowcobble', desc = 'Snow Cobble' },
{ subname = 'mold_cobble', recipeitem = 'everness:mold_cobble', desc = 'Mold Cobble' },
-- Obsidian & Volcanic blocks
{ subname = 'weeping_obsidian', recipeitem = 'everness:weeping_obsidian', desc = 'Weeping Obsidian' },
{ subname = 'blue_crying_obsidian', recipeitem = 'everness:blue_crying_obsidian', desc = 'Blue Crying Obsidian' },
{ subname = 'blue_weeping_obsidian', recipeitem = 'everness:blue_weeping_obsidian', desc = 'Blue Weeping Obsidian' },
{ subname = 'sulfur_stone', recipeitem = 'everness:sulfur_stone', desc = 'Sulfur Stone' },
{ subname = 'volcanic_sulfur', recipeitem = 'everness:volcanic_sulfur', desc = 'Volcanic Sulfur Stone' },
-- Bone & Coral
{ subname = 'bone', recipeitem = 'everness:bone', desc = 'Bone Block' },
{ subname = 'crystal_coral_dark', recipeitem = 'everness:crystal_coral_dark', desc = 'Crystal Coral Dark' },
-- Glass
{ subname = 'pyrite_glass', recipeitem = 'everness:pyrite_glass', desc = 'Pyrite Glass' },
{ subname = 'tinted_glass_red', recipeitem = 'everness:tinted_glass_red', desc = 'Tinted Glass Red' },
}
for _, item in ipairs(extra_nodes) do
local def = core.registered_nodes[item.recipeitem]
if def then
local tiles = table.copy(def.tiles or {})
if #tiles > 1 and def.drawtype and def.drawtype:find('glass') then
tiles = { tiles[1] }
end
register_stairsplus('everness', item.subname, item.recipeitem, {
description = S(item.desc),
tiles = tiles,
groups = table.copy(def.groups or {}),
sounds = def.sounds,
})
end
end
core.log('action', '[Everness] More Blocks / Circular Saw integration loaded successfully.')
+48
View File
@@ -0,0 +1,48 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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 = core.get_translator(core.get_current_modname())
--
-- Buckets
--
if core.get_modpath('bucket') then
bucket.register_liquid(
'everness:mineral_water_source',
'everness:mineral_water_flowing',
'everness:bucket_mineral_water',
'everness_mtg_bucket_mineral_water.png',
S('Mineral') .. ' ' .. S('Water') .. ' ' .. S('Bucket'),
{ tool = 1, water_bucket = 1 }
)
bucket.register_liquid(
'everness:lava_source',
'everness:lava_flowing',
'everness:bucket_lava',
'everness_mtg_bucket_lava.png',
S('Lava Bucket'),
{ tool = 1 }
)
core.register_craft({
type = 'fuel',
recipe = 'everness:bucket_lava',
burntime = 370,
replacements = {{ 'everness:bucket_lava', 'bucket:bucket_empty' }},
})
end
+170
View File
@@ -0,0 +1,170 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
core.register_alias('mapgen_water_source', 'rp_mapgen_water_source')
core.register_alias('default:dirt_with_rainforest_litter', 'rp_default:dirt_with_grass')
core.register_alias('default:dirt_with_snow', 'rp_default:dirt_with_grass')
core.register_alias('default:dirt_with_coniferous_litter', 'rp_default:dirt_with_grass')
core.register_alias('default:dirt_with_grass', 'rp_default:dirt_with_grass')
core.register_alias('default:stick', 'rp_default:stick')
core.register_alias('default:paper', 'rp_default:paper')
core.register_alias('default:book', 'rp_default:book')
core.register_alias('default:skeleton_key', 'rp_default:skeleton_key')
core.register_alias('default:flint', 'rp_default:flint')
core.register_alias('default:obsidian_shard', 'rp_default:obsidian_shard')
core.register_alias('default:clay_brick', 'rp_default:clay_brick')
core.register_alias('default:mese_crystal_fragment', 'rp_default:mese_crystal_fragment')
-- Ingots
core.register_alias('default:gold_ingot', 'rp_default:gold_ingot')
core.register_alias('default:bronze_ingot', 'rp_default:bronze_ingot')
core.register_alias('default:tin_ingot', 'rp_default:tin_ingot')
core.register_alias('default:copper_ingot', 'rp_default:copper_ingot')
core.register_alias('default:steel_ingot', 'rp_default:steel_ingot')
core.register_alias('default:coal_lump', 'rp_default:coal_lump')
-- Tools
core.register_alias('default:pick_stone', 'rp_default:pick_stone')
core.register_alias('default:pick_bronze', 'rp_default:pick_bronze')
core.register_alias('default:pick_steel', 'rp_default:pick_steel')
core.register_alias('default:shovel_stone', 'rp_default:shovel_stone')
core.register_alias('default:shovel_bronze', 'rp_default:shovel_bronze')
core.register_alias('default:shovel_steel', 'rp_default:shovel_steel')
core.register_alias('default:axe_stone', 'rp_default:axe_stone')
core.register_alias('default:axe_bronze', 'rp_default:axe_bronze')
core.register_alias('default:axe_steel', 'rp_default:axe_steel')
core.register_alias('default:sword_stone', 'rp_default:sword_stone')
core.register_alias('default:sword_bronze', 'rp_default:sword_bronze')
core.register_alias('default:sword_steel', 'rp_default:sword_steel')
-- Items / Nodes
core.register_alias('default:bookshelf', 'rp_default:bookshelf')
core.register_alias('default:sign_wall_wood', 'rp_default:sign_wall_wood')
core.register_alias('default:ladder_wood', 'rp_default:ladder_wood')
core.register_alias('default:ladder_steel', 'rp_default:ladder_steel')
core.register_alias('default:glass', 'rp_default:glass')
core.register_alias('default:obsidian_glass', 'rp_default:obsidian_glass')
-- Trees
core.register_alias('default:tree', 'rp_default:tree')
core.register_alias('default:jungletree', 'rp_default:jungletree')
core.register_alias('default:pine_tree', 'rp_default:pine_tree')
core.register_alias('default:cactus', 'rp_default:cactus')
core.register_alias('default:large_cactus_seedling', 'rp_default:large_cactus_seedling')
core.register_alias('default:papyrus', 'rp_default:papyrus')
core.register_alias('default:junglegrass', 'rp_default:junglegrass')
core.register_alias('default:blueberry_bush_sapling', 'rp_default:blueberry_bush_sapling')
core.register_alias('default:sapling', 'rp_default:sapling')
core.register_alias('default:junglesapling', 'rp_default:junglesapling')
core.register_alias('default:pine_sapling', 'rp_default:pine_sapling')
core.register_alias('default:acacia_sapling', 'rp_default:acacia_sapling')
core.register_alias('default:aspen_sapling', 'rp_default:aspen_sapling')
core.register_alias('default:clay_lump', 'rp_default:clay_lump')
core.register_alias('default:tin_lump', 'rp_default:tin_lump')
core.register_alias('default:copper_lump', 'rp_default:copper_lump')
core.register_alias('default:iron_lump', 'rp_default:iron_lump')
core.register_alias('default:coalblock', 'rp_default:block_coal')
core.register_alias('default:steelblock', 'rp_default:steelblock')
core.register_alias('default:copperblock', 'rp_default:copperblock')
core.register_alias('default:tinblock', 'rp_default:tinblock')
core.register_alias('default:bronzeblock', 'rp_default:bronzeblock')
core.register_alias('default:mese', 'rp_default:mese')
core.register_alias('default:meselamp', 'rp_default:meselamp')
core.register_alias('default:obsidian', 'rp_default:obsidian')
core.register_alias('default:mese_crystal', 'rp_default:mese_crystal')
core.register_alias('default:diamond', 'rp_default:diamond')
core.register_alias('default:pick_mese', 'rp_default:pick_mese')
core.register_alias('default:shovel_mese', 'rp_default:shovel_mese')
core.register_alias('default:axe_mese', 'rp_default:axe_mese')
core.register_alias('default:sword_mese', 'rp_default:sword_mese')
core.register_alias('default:snowblock', 'rp_default:snowblock')
core.register_alias('default:ice', 'rp_default:ice')
core.register_alias('default:torch', 'rp_default:torch')
core.register_alias('default:cobble', 'rp_default:cobble')
core.register_alias('default:chest', 'rp_default:chest')
core.register_alias('default:snow', 'rp_default:snow')
core.register_alias('default:stone', 'rp_default:stone')
core.register_alias('default:sand', 'rp_default:sand')
core.register_alias('default:gravel', 'rp_default:gravel')
core.register_alias('default:stone_with_coal', 'rp_default:stone_with_coal')
core.register_alias('default:stone_with_iron', 'rp_default:stone_with_iron')
core.register_alias('default:stone_with_copper', 'rp_default:stone_with_copper')
core.register_alias('default:stone_with_tin', 'rp_default:stone_with_tin')
core.register_alias('default:stone_with_gold', 'rp_default:stone_with_gold')
core.register_alias('default:stone_with_mese', 'rp_default:stone_with_mese')
core.register_alias('default:stone_with_diamond', 'rp_default:stone_with_diamond')
core.register_alias('mapgen_lava_source', 'rp_mapgen_water_source')
core.register_alias('default:mossycobble', 'rp_default:mossycobble')
core.register_alias('default:clay', 'rp_default:clay')
core.register_alias('default:dry_dirt_with_dry_grass', 'rp_default:dry_dirt_with_dry_grass')
core.register_alias('default:dry_dirt', 'rp_default:dry_dirt')
core.register_alias('default:coral_skeleton', 'everness:coral_skeleton')
core.register_alias('default:lava_flowing', 'rp_default:water_flowing')
core.register_alias('everness:cursed_brick_with_growth_wall', 'air')
core.register_alias('stairs:slab_cursed_brick_with_growth', 'air')
core.register_alias('default:fence_wood', 'rp_default:fence')
core.register_alias('default:torch_wall', 'rp_default:torch_wall')
core.register_alias('default:wood', 'rp_default:planks')
core.register_alias('default:junglewood', 'rp_default:junglewood')
core.register_alias('default:pine_wood', 'rp_default:pine_wood')
core.register_alias('default:mese_post_light_pine_wood', 'rp_default:mese_post_light_pine_wood')
core.register_alias_force('default:acacia_tree', 'rp_default:acacia_tree')
core.register_alias('default:dry_grass_4', 'rp_default:dry_grass_4')
core.register_alias('default:dry_grass_2', 'rp_default:dry_grass_2')
core.register_alias('default:dry_shrub', 'rp_default:dry_shrub')
core.register_alias('default:stonebrick', 'rp_default:stonebrick')
core.register_alias('default:jungleleaves', 'rp_default:jungleleaves')
core.register_alias('default:torch_ceiling', 'rp_default:torch_ceiling')
core.register_alias('default:goldblock', 'rp_default:goldblock')
core.register_alias('stairs:stair_coral_white_sandstone', 'mcl_stairs:stair_coral_white_sandstone')
core.register_alias('stairs:slab_coral_white_sandstone', 'mcl_stairs:slab_coral_white_sandstone')
core.register_alias('stairs:stair_coral_deep_ocean_sandstone_block', 'mcl_stairs:stair_coral_deep_ocean_sandstone_block')
core.register_alias('stairs:slab_coral_deep_ocean_sandstone_block', 'mcl_stairs:slab_coral_deep_ocean_sandstone_block')
core.register_alias('stairs:slab_coral_deep_ocean_sandstone_brick', 'mcl_stairs:slab_coral_deep_ocean_sandstone_brick')
core.register_alias('stairs:slab_coral_sandstone_brick', 'mcl_stairs:slab_coral_sandstone_brick')
core.register_alias('stairs:stair_coral_deep_ocean_sandstone_brick', 'mcl_stairs:stair_coral_deep_ocean_sandstone_brick')
core.register_alias('stairs:stair_crystal_forest_deep_ocean_sandstone_block', 'mcl_stairs:stair_crystal_forest_deep_ocean_sandstone_block')
core.register_alias('stairs:stair_crystal_forest_deep_ocean_sandstone_brick', 'mcl_stairs:stair_crystal_forest_deep_ocean_sandstone_brick')
core.register_alias('stairs:slab_crystal_forest_deep_ocean_sandstone_block', 'mcl_stairs:slab_crystal_forest_deep_ocean_sandstone_block')
core.register_alias('stairs:slab_crystal_forest_deep_ocean_sandstone_brick', 'mcl_stairs:slab_crystal_forest_deep_ocean_sandstone_brick')
core.register_alias('stairs:stair_forsaken_desert_brick_red', 'mcl_stairs:stair_forsaken_desert_brick_red')
core.register_alias('stairs:stair_forsaken_desert_chiseled_stone', 'mcl_stairs:stair_forsaken_desert_chiseled_stone')
core.register_alias('stairs:slab_forsaken_desert_chiseled_stone', 'mcl_stairs:slab_forsaken_desert_chiseled_stone')
core.register_alias('stairs:stair_junglewood', 'mcl_stairs:stair_junglewood')
core.register_alias('stairs:slab_junglewood', 'mcl_stairs:slab_junglewood')
core.register_alias('stairs:slab_dry_wood', 'mcl_stairs:slab_dry_wood')
core.register_alias('stairs:stair_dry_wood', 'mcl_stairs:stair_dry_wood')
core.register_alias('stairs:stair_wood', 'mcl_stairs:stair_wood')
core.register_alias('stairs:slab_stonebrick', 'mcl_stairs:slab_stonebrick')
core.register_alias('stairs:stair_inner_wood', 'mcl_stairs:stair_wood_inner')
core.register_alias('stairs:stair_outer_stonebrick', 'mcl_stairs:stair_stonebrick_outer')
core.register_alias('stairs:stair_stonebrick', 'mcl_stairs:stair_stonebrick')
-- core.register_alias('stairs:stair_cobble', 'mcl_stairs:stair_cobble')
core.register_alias('stairs:stair_mossycobble', 'mcl_stairs:stair_mossycobble')
core.register_alias('stairs:stair_outer_quartz_chiseled', 'mcl_stairs:stair_quartz_chiseled_outer')
core.register_alias('stairs:stair_quartz_chiseled', 'mcl_stairs:stair_quartz_chiseled')
core.register_alias('stairs:stair_inner_quartz_chiseled', 'mcl_stairs:stair_quartz_chiseled_inner')
core.register_alias('stairs:slab_quartz_chiseled', 'mcl_stairs:slab_quartz_chiseled')
core.register_alias('stairs:stair_coral_desert_stone_block', 'mcl_stairs:stair_coral_desert_stone_block')
core.register_alias('everness:cursed_brick_wall', 'everness:cursedbrickwall')
core.register_alias('walls:cobble', 'mcl_walls:cobble')
core.register_alias('xpanes:trapdoor_steel_bar', 'mcl_doors:iron_trapdoor')
core.register_alias('doors:trapdoor_open', 'mcl_doors:trapdoor_open')
core.register_alias('doors:trapdoor', 'mcl_doors:trapdoor')
core.register_alias('doors:door_wood_a', 'mcl_doors:wooden_door')
core.register_alias('doors:hidden', 'air')
core.register_alias('everness:cobweb', 'mcl_core:cobweb')
core.register_alias('fire:permanent_flame', 'air')
+257
View File
@@ -0,0 +1,257 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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.
--]]
--
-- Bonemeal Trees
--
x_farming.x_bonemeal:register_tree_defs({
{
-- sapling name
name = 'everness:coral_tree_sapling',
-- 1 out of `chance`, e.g. 2 = 50% chance
chance = 3,
-- grow tree from sapling
grow_tree = function(pos)
if not x_farming.x_bonemeal.is_on_soil(pos) then
return false
end
Everness.grow_coral_tree(pos)
return true
end
},
{
-- sapling name
name = 'everness:coral_tree_bioluminescent_sapling',
-- 1 out of `chance`, e.g. 2 = 50% chance
chance = 3,
-- grow tree from sapling
grow_tree = function(pos)
if not x_farming.x_bonemeal.is_on_soil(pos) then
return false
end
Everness.coral_tree_bioluminescent(pos)
return true
end
},
{
-- sapling name
name = 'everness:crystal_bush_sapling',
-- 1 out of `chance`, e.g. 2 = 50% chance
chance = 3,
-- grow tree from sapling
grow_tree = function(pos)
if not x_farming.x_bonemeal.is_on_soil(pos) then
return false
end
Everness.grow_crystal_bush(pos)
return true
end
},
{
-- sapling name
name = 'everness:cursed_bush_sapling',
-- 1 out of `chance`, e.g. 2 = 50% chance
chance = 3,
-- grow tree from sapling
grow_tree = function(pos)
if not x_farming.x_bonemeal.is_on_soil(pos) then
return false
end
Everness.grow_cursed_bush(pos)
return true
end
},
{
-- sapling name
name = 'everness:baobab_sapling',
-- 1 out of `chance`, e.g. 2 = 50% chance
chance = 3,
-- grow tree from sapling
grow_tree = function(pos)
if not x_farming.x_bonemeal.is_on_soil(pos) then
return false
end
Everness.grow_baobab_tree(pos)
return true
end
},
{
-- sapling name
name = 'everness:dry_tree_sapling',
-- 1 out of `chance`, e.g. 2 = 50% chance
chance = 3,
-- grow tree from sapling
grow_tree = function(pos)
if not x_farming.x_bonemeal.is_on_soil(pos) then
return false
end
Everness.grow_dry_tree(pos)
return true
end
},
{
-- sapling name
name = 'everness:willow_tree_sapling',
-- 1 out of `chance`, e.g. 2 = 50% chance
chance = 3,
-- grow tree from sapling
grow_tree = function(pos)
if not x_farming.x_bonemeal.is_on_soil(pos) then
return false
end
Everness.grow_willow_tree(pos)
return true
end
},
{
-- sapling name
name = 'everness:sequoia_tree_sapling',
-- 1 out of `chance`, e.g. 2 = 50% chance
chance = 3,
-- grow tree from sapling
grow_tree = function(pos)
if not x_farming.x_bonemeal.is_on_soil(pos) then
return false
end
Everness.grow_sequoia_tree(pos)
return true
end
},
{
-- sapling name
name = 'everness:crystal_tree_sapling',
-- 1 out of `chance`, e.g. 2 = 50% chance
chance = 3,
-- grow tree from sapling
grow_tree = function(pos)
if not x_farming.x_bonemeal.is_on_soil(pos) then
return false
end
Everness.grow_crystal_tree(pos)
return true
end
},
{
-- sapling name
name = 'everness:crystal_tree_large_sapling',
-- 1 out of `chance`, e.g. 2 = 50% chance
chance = 3,
-- grow tree from sapling
grow_tree = function(pos)
if not x_farming.x_bonemeal.is_on_soil(pos) then
return false
end
Everness.grow_crystal_large_tree(pos)
return true
end
},
{
-- sapling name
name = 'everness:cursed_dream_tree_sapling',
-- 1 out of `chance`, e.g. 2 = 50% chance
chance = 3,
-- grow tree from sapling
grow_tree = function(pos)
if not x_farming.x_bonemeal.is_on_soil(pos) then
return false
end
Everness.grow_cursed_dream_tree(pos)
return true
end
},
{
-- sapling name
name = 'everness:mese_tree_sapling',
-- 1 out of `chance`, e.g. 2 = 50% chance
chance = 4,
-- grow tree from sapling
grow_tree = function(pos)
if not x_farming.x_bonemeal.is_on_soil(pos) then
return false
end
Everness.grow_mese_tree(pos)
return true
end
},
{
-- sapling name
name = 'everness:palm_tree_sapling',
-- 1 out of `chance`, e.g. 2 = 50% chance
chance = 4,
-- grow tree from sapling
grow_tree = function(pos)
if not x_farming.x_bonemeal.is_on_sand(pos) then
return false
end
Everness.grow_palm_tree(pos)
return true
end
},
{
-- sapling name
name = 'everness:lava_tree_sapling',
-- 1 out of `chance`, e.g. 2 = 50% chance
chance = 4,
-- grow tree from sapling
grow_tree = function(pos)
if not x_farming.x_bonemeal.is_on_soil(pos) then
return false
end
Everness.grow_lava_tree(pos)
return true
end
},
})
--
-- Recipes
--
core.register_craft({
output = 'x_farming:bonemeal 4',
recipe = {
{ 'everness:bone' }
}
})
@@ -0,0 +1,582 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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 mod_start_time = core.get_us_time()
-- Bamboo Forest
local path_nodes_bamboo_forest = {
['everness:dirt_with_grass_1'] = {
name = 'dirt_with_grass_1',
mod_origin = 'everness',
descritption = 'Dirt with Grass Path',
drop = 'everness:dirt_1',
tiles = {
'x_obsidianmese_path_dirt_base.png^(everness_grass_top.png^[mask:x_obsidianmese_path_overlay.png)',
'x_obsidianmese_path_dirt_base.png',
'x_obsidianmese_dirt_path_side.png'
},
sounds = Everness.node_sound_dirt_defaults()
},
['everness:dirt_with_grass_extras_1'] = {
name = 'dirt_with_grass_extras_1',
mod_origin = 'everness',
descritption = 'Dirt with Grass Path',
drop = 'everness:dirt_1',
tiles = {
'x_obsidianmese_path_dirt_base.png^(everness_grass_top.png^[mask:x_obsidianmese_path_overlay.png)',
'x_obsidianmese_path_dirt_base.png',
'x_obsidianmese_dirt_path_side.png'
},
sounds = Everness.node_sound_dirt_defaults()
},
['everness:dirt_with_grass_extras_2'] = {
name = 'dirt_with_grass_extras_2',
mod_origin = 'everness',
descritption = 'Dirt with Grass Path',
drop = 'everness:dirt_1',
tiles = {
'x_obsidianmese_path_dirt_base.png^(everness_grass_top.png^[mask:x_obsidianmese_path_overlay.png)',
'x_obsidianmese_path_dirt_base.png',
'x_obsidianmese_dirt_path_side.png'
},
sounds = Everness.node_sound_dirt_defaults()
},
['everness:dirt_1'] = {
name = 'dirt_1',
mod_origin = 'everness',
descritption = 'Dirt Path',
drop = 'everness:dirt_1',
tiles = {
'x_obsidianmese_path_dirt_base.png^(everness_dirt.png^[mask:x_obsidianmese_path_overlay_2.png)',
'x_obsidianmese_path_dirt_base.png',
'x_obsidianmese_dirt_path_side.png'
},
sounds = Everness.node_sound_dirt_defaults()
}
}
local path_nodes_baobab_savanna = {
['everness:dry_dirt_with_dry_grass'] = {
name = 'dry_dirt_with_dry_grass',
mod_origin = 'everness',
descritption = 'Dry Dirt with Dry Grass Path',
drop = 'everness:dry_dirt',
tiles = {
'x_obsidianmese_path_dirt_base.png^[colorize:#B88C5E:127^(everness_dry_grass_top.png^[mask:x_obsidianmese_path_overlay.png)',
'x_obsidianmese_path_dirt_base.png^[colorize:#B88C5E:127',
'x_obsidianmese_dirt_path_side.png^[colorize:#B88C5E:127'
},
sounds = Everness.node_sound_dirt_defaults()
},
['everness:dry_dirt'] = {
name = 'dry_dirt',
mod_origin = 'everness',
descritption = 'Dry Dirt Path',
drop = 'everness:dry_dirt',
tiles = {
'x_obsidianmese_path_dirt_base.png^[colorize:#B88C5E:127^(everness_dry_dirt.png^[mask:x_obsidianmese_path_overlay_2.png)',
'x_obsidianmese_path_dirt_base.png^[colorize:#B88C5E:127',
'x_obsidianmese_dirt_path_side.png^[colorize:#B88C5E:127'
},
sounds = Everness.node_sound_dirt_defaults()
}
}
-- Crystal Forest
local path_nodes_crystal_forest = {
['everness:dirt_with_crystal_grass'] = {
name = 'dirt_with_crystal_grass',
mod_origin = 'everness',
descritption = 'Dirt with Crystal Grass Path',
drop = 'everness:crystal_dirt',
tiles = {
'x_obsidianmese_path_dirt_base.png^[colorize:#755069:127^(everness_crystal_grass.png^[mask:x_obsidianmese_path_overlay.png)',
'x_obsidianmese_path_dirt_base.png^[colorize:#755069:127',
'x_obsidianmese_dirt_path_side.png^[colorize:#755069:127'
},
sounds = Everness.node_sound_dirt_defaults()
},
['everness:crystal_dirt'] = {
name = 'crystal_dirt',
mod_origin = 'everness',
descritption = 'Crystal Dirt Path',
drop = 'everness:crystal_dirt',
tiles = {
'x_obsidianmese_path_dirt_base.png^[colorize:#755069:127^(everness_crystal_dirt.png^[mask:x_obsidianmese_path_overlay_2.png)',
'x_obsidianmese_path_dirt_base.png^[colorize:#755069:127',
'x_obsidianmese_dirt_path_side.png^[colorize:#755069:127'
},
sounds = Everness.node_sound_dirt_defaults()
},
}
local path_nodes_crystal_forest_dunes = {
['everness:crystal_sand'] = {
name = 'crystal_sand',
mod_origin = 'everness',
descritption = 'Crystal Sand Path',
drop = 'everness:crystal_sand',
tiles = {
'x_obsidianmese_path_dirt_base.png^[colorize:#845D88:170^(everness_crystal_sand.png^[mask:x_obsidianmese_path_overlay_2.png)',
'x_obsidianmese_path_dirt_base.png^[colorize:#845D88:170',
'x_obsidianmese_dirt_path_side.png^[colorize:#845D88:170'
},
sounds = Everness.node_sound_sand_defaults()
},
}
local path_nodes_crystal_forest_shore = {
['everness:crystal_sand'] = {
name = 'crystal_sand',
mod_origin = 'everness',
descritption = 'Crystal Sand Path',
drop = 'everness:crystal_sand',
tiles = {
'x_obsidianmese_path_dirt_base.png^[colorize:#845D88:170^(everness_crystal_sand.png^[mask:x_obsidianmese_path_overlay_2.png)',
'x_obsidianmese_path_dirt_base.png^[colorize:#845D88:170',
'x_obsidianmese_dirt_path_side.png^[colorize:#845D88:170'
},
sounds = Everness.node_sound_sand_defaults()
},
}
local path_nodes_crystal_forest_ocean = {
['everness:crystal_sand'] = {
name = 'crystal_sand',
mod_origin = 'everness',
descritption = 'Crystal Sand Path',
drop = 'everness:crystal_sand',
tiles = {
'x_obsidianmese_path_dirt_base.png^[colorize:#845D88:170^(everness_crystal_sand.png^[mask:x_obsidianmese_path_overlay_2.png)',
'x_obsidianmese_path_dirt_base.png^[colorize:#845D88:170',
'x_obsidianmese_dirt_path_side.png^[colorize:#845D88:170'
},
sounds = Everness.node_sound_sand_defaults()
},
}
local path_nodes_crystal_forest_under = {
['everness:crystal_cave_dirt_with_moss'] = {
name = 'crystal_cave_dirt_with_moss',
mod_origin = 'everness',
descritption = 'Crystal Cave Dirt with Moss Path',
drop = 'everness:crystal_cave_dirt',
tiles = {
'x_obsidianmese_path_dirt_base.png^[colorize:#EEDDB2:127^(everness_crystal_cave_dirt_top.png^[mask:x_obsidianmese_path_overlay.png)',
'x_obsidianmese_path_dirt_base.png^[colorize:#EEDDB2:127',
'x_obsidianmese_dirt_path_side.png^[colorize:#EEDDB2:127'
},
sounds = Everness.node_sound_dirt_defaults()
},
['everness:crystal_cave_dirt'] = {
name = 'crystal_cave_dirt',
mod_origin = 'everness',
descritption = 'Crystal Cave Dirt',
drop = 'everness:crystal_cave_dirt',
tiles = {
'x_obsidianmese_path_dirt_base.png^[colorize:#EEDDB2:127^(everness_crystal_cave_dirt.png^[mask:x_obsidianmese_path_overlay_2.png)',
'x_obsidianmese_path_dirt_base.png^[colorize:#EEDDB2:127',
'x_obsidianmese_dirt_path_side.png^[colorize:#EEDDB2:127'
},
sounds = Everness.node_sound_dirt_defaults()
},
}
-- Forsaken Tundra
local path_nodes_forsaken_tundra = {
['everness:forsaken_tundra_dirt_with_grass'] = {
name = 'forsaken_tundra_dirt_with_grass',
mod_origin = 'everness',
descritption = 'Forsaken Tundra Dirt with Grass Path',
drop = 'everness:forsaken_tundra_dirt_with_grass',
tiles = {
'x_obsidianmese_path_dirt_base.png^[colorize:#151611:170^(everness_forsaken_tundra_grass.png^[mask:x_obsidianmese_path_overlay.png)',
'x_obsidianmese_path_dirt_base.png^[colorize:#151611:170',
'x_obsidianmese_dirt_path_side.png^[colorize:#151611:170'
},
sounds = Everness.node_sound_dirt_defaults()
},
['everness:forsaken_tundra_dirt'] = {
name = 'forsaken_tundra_dirt',
mod_origin = 'everness',
descritption = 'Forsaken Tundra Dirt Path',
drop = 'everness:forsaken_tundra_dirt',
tiles = {
'x_obsidianmese_path_dirt_base.png^[colorize:#151611:170^(everness_forsaken_tundra_dirt.png^[mask:x_obsidianmese_path_overlay_2.png)',
'x_obsidianmese_path_dirt_base.png^[colorize:#151611:170',
'x_obsidianmese_dirt_path_side.png^[colorize:#151611:170'
},
sounds = Everness.node_sound_dirt_defaults()
},
['everness:forsaken_tundra_beach_sand'] = {
name = 'forsaken_tundra_beach_sand',
mod_origin = 'everness',
descritption = 'Forsaken Tundra Beach Sand Path',
drop = 'everness:forsaken_tundra_beach_sand',
tiles = {
'x_obsidianmese_path_dirt_base.png^[colorize:#4C4341:170^(everness_forsaken_tundra_beach_sand.png^[mask:x_obsidianmese_path_overlay_2.png)',
'x_obsidianmese_path_dirt_base.png^[colorize:#4C4341:170',
'x_obsidianmese_dirt_path_side.png^[colorize:#4C4341:170'
},
sounds = Everness.node_sound_sand_defaults()
},
}
local path_nodes_forsaken_tundra_beach = {
['everness:forsaken_tundra_beach_sand'] = {
name = 'forsaken_tundra_beach_sand',
mod_origin = 'everness',
descritption = 'Forsaken Tundra Beach Sand Path',
drop = 'everness:forsaken_tundra_beach_sand',
tiles = {
'x_obsidianmese_path_dirt_base.png^[colorize:#4C4341:170^(everness_forsaken_tundra_beach_sand.png^[mask:x_obsidianmese_path_overlay_2.png)',
'x_obsidianmese_path_dirt_base.png^[colorize:#4C4341:170',
'x_obsidianmese_dirt_path_side.png^[colorize:#4C4341:170'
},
sounds = Everness.node_sound_sand_defaults()
},
['everness:forsaken_tundra_beach_sand_with_shells'] = {
name = 'forsaken_tundra_beach_sand_with_shells',
mod_origin = 'everness',
descritption = 'Forsaken Tundra Beach Sand with Shells',
drop = 'everness:forsaken_tundra_beach_sand_with_shells',
tiles = {
'x_obsidianmese_path_dirt_base.png^[colorize:#4C4341:170^(everness_forsaken_tundra_beach_sand_with_shells.png^[mask:x_obsidianmese_path_overlay_2.png)',
'x_obsidianmese_path_dirt_base.png^[colorize:#4C4341:170',
'x_obsidianmese_dirt_path_side.png^[colorize:#4C4341:170'
},
sounds = Everness.node_sound_sand_defaults()
},
}
local path_nodes_forsaken_tundra_ocean = {
['everness:forsaken_tundra_beach_sand'] = {
name = 'forsaken_tundra_beach_sand',
mod_origin = 'everness',
descritption = 'Forsaken Tundra Beach Sand Path',
drop = 'everness:forsaken_tundra_beach_sand',
tiles = {
'x_obsidianmese_path_dirt_base.png^[colorize:#4C4341:170^(everness_forsaken_tundra_beach_sand.png^[mask:x_obsidianmese_path_overlay_2.png)',
'x_obsidianmese_path_dirt_base.png^[colorize:#4C4341:170',
'x_obsidianmese_dirt_path_side.png^[colorize:#4C4341:170'
},
sounds = Everness.node_sound_sand_defaults()
},
['everness:forsaken_tundra_beach_sand_with_shells'] = {
name = 'forsaken_tundra_beach_sand_with_shells',
mod_origin = 'everness',
descritption = 'Forsaken Tundra Beach Sand with Shells',
drop = 'everness:forsaken_tundra_beach_sand_with_shells',
tiles = {
'x_obsidianmese_path_dirt_base.png^[colorize:#4C4341:170^(everness_forsaken_tundra_beach_sand_with_shells.png^[mask:x_obsidianmese_path_overlay_2.png)',
'x_obsidianmese_path_dirt_base.png^[colorize:#4C4341:170',
'x_obsidianmese_dirt_path_side.png^[colorize:#4C4341:170'
},
sounds = Everness.node_sound_sand_defaults()
},
}
-- Forsaken Desert
local path_nodes_forsaken_desert = {
['everness:forsaken_desert_sand'] = {
name = 'forsaken_desert_sand',
mod_origin = 'everness',
descritption = 'Forsaken Desert Sand Path',
drop = 'everness:forsaken_desert_sand',
tiles = {
'x_obsidianmese_path_dirt_base.png^[colorize:#D1906A:170^(everness_forsaken_desert_sand.png^[mask:x_obsidianmese_path_overlay_2.png)',
'x_obsidianmese_path_dirt_base.png^[colorize:#D1906A:170',
'x_obsidianmese_dirt_path_side.png^[colorize:#D1906A:170'
},
sounds = Everness.node_sound_sand_defaults()
}
}
local path_nodes_forsaken_desert_ocean = {
['everness:dry_ocean_dirt'] = {
name = 'dry_ocean_dirt',
mod_origin = 'everness',
descritption = 'Dry Ocean Dirt Path',
drop = 'everness:dry_ocean_dirt',
tiles = {
'x_obsidianmese_path_dirt_base.png^[colorize:#AB7D54:127^(everness_forsaken_desert_dry_ocean_dirt.png^[mask:x_obsidianmese_path_overlay_2.png)',
'x_obsidianmese_path_dirt_base.png^[colorize:#AB7D54:127',
'x_obsidianmese_dirt_path_side.png^[colorize:#AB7D54:127'
},
sounds = Everness.node_sound_dirt_defaults()
}
}
local path_nodes_forsaken_desert_under = {
['everness:forsaken_desert_sand'] = {
name = 'forsaken_desert_sand',
mod_origin = 'everness',
descritption = 'Forsaken Desert Sand Path',
drop = 'everness:forsaken_desert_sand',
tiles = {
'x_obsidianmese_path_dirt_base.png^[colorize:#D1906A:170^(everness_forsaken_desert_sand.png^[mask:x_obsidianmese_path_overlay_2.png)',
'x_obsidianmese_path_dirt_base.png^[colorize:#D1906A:170',
'x_obsidianmese_dirt_path_side.png^[colorize:#D1906A:170'
},
sounds = Everness.node_sound_sand_defaults()
}
}
-- Cursed Lands
local path_nodes_cursed_lands_and_dunes_ocean = {
['everness:dirt_with_cursed_grass'] = {
name = 'dirt_with_cursed_grass',
mod_origin = 'everness',
descritption = 'Dirt with Cursed Grass Path',
drop = 'everness:cursed_dirt',
tiles = {
'x_obsidianmese_path_dirt_base.png^[colorize:#696151:170^(everness_cursed_grass.png^[mask:x_obsidianmese_path_overlay.png)',
'x_obsidianmese_path_dirt_base.png^[colorize:#696151:170',
'x_obsidianmese_dirt_path_side.png^[colorize:#696151:170'
},
sounds = Everness.node_sound_mud_defaults()
},
['everness:cursed_dirt'] = {
name = 'cursed_dirt',
mod_origin = 'everness',
descritption = 'Cursed Dirt Path',
drop = 'everness:cursed_dirt',
tiles = {
'x_obsidianmese_path_dirt_base.png^[colorize:#696151:170^(everness_cursed_dirt.png^[mask:x_obsidianmese_path_overlay_2.png)',
'x_obsidianmese_path_dirt_base.png^[colorize:#696151:170',
'x_obsidianmese_dirt_path_side.png^[colorize:#696151:170'
},
sounds = Everness.node_sound_mud_defaults()
},
['everness:cursed_sand'] = {
name = 'cursed_sand',
mod_origin = 'everness',
descritption = 'Cursed Sand Path',
drop = 'everness:cursed_sand',
tiles = {
'x_obsidianmese_path_dirt_base.png^[colorize:#856F58:170^(everness_cursed_sand.png^[mask:x_obsidianmese_path_overlay_2.png)',
'x_obsidianmese_path_dirt_base.png^[colorize:#856F58:170',
'x_obsidianmese_dirt_path_side.png^[colorize:#856F58:170'
},
sounds = Everness.node_sound_sand_defaults()
},
}
-- Coral Forest
local path_nodes_coral_forest_and_dunes = {
['everness:dirt_with_coral_grass'] = {
name = 'dirt_with_coral_grass',
mod_origin = 'everness',
descritption = 'Dirt with Coral Grass Path',
drop = 'everness:coral_dirt',
tiles = {
'x_obsidianmese_path_dirt_base.png^[colorize:#AA683F:127^(everness_coral_grass.png^[mask:x_obsidianmese_path_overlay.png)',
'x_obsidianmese_path_dirt_base.png^[colorize:#AA683F:127',
'x_obsidianmese_dirt_path_side.png^[colorize:#AA683F:127'
},
sounds = Everness.node_sound_dirt_defaults()
},
['everness:coral_dirt'] = {
name = 'coral_dirt',
mod_origin = 'everness',
descritption = 'Coral Dirt Path',
drop = 'everness:coral_dirt',
tiles = {
'x_obsidianmese_path_dirt_base.png^[colorize:#AA683F:127^(everness_coral_dirt.png^[mask:x_obsidianmese_path_overlay_2.png)',
'x_obsidianmese_path_dirt_base.png^[colorize:#AA683F:127',
'x_obsidianmese_dirt_path_side.png^[colorize:#AA683F:127'
},
sounds = Everness.node_sound_dirt_defaults()
},
['everness:coral_sand'] = {
name = 'coral_sand',
mod_origin = 'everness',
descritption = 'Coral Sand Path',
drop = 'everness:coral_sand',
tiles = {
'x_obsidianmese_path_dirt_base.png^[colorize:#AB633D:170^(everness_coral_sand.png^[mask:x_obsidianmese_path_overlay_2.png)',
'x_obsidianmese_path_dirt_base.png^[colorize:#AB633D:170',
'x_obsidianmese_dirt_path_side.png^[colorize:#AB633D:170'
},
sounds = Everness.node_sound_sand_defaults()
},
['everness:coral_white_sand'] = {
name = 'coral_white_sand',
mod_origin = 'everness',
descritption = 'Coral White Sand Path',
drop = 'everness:coral_white_sand',
tiles = {
'x_obsidianmese_path_dirt_base.png^[colorize:#F9F4FB:170^(everness_coral_white_sand.png^[mask:x_obsidianmese_path_overlay_2.png)',
'x_obsidianmese_path_dirt_base.png^[colorize:#F9F4FB:170',
'x_obsidianmese_dirt_path_side.png^[colorize:#F9F4FB:170'
},
sounds = Everness.node_sound_sand_defaults()
},
}
local path_nodes_coral_forest_ocean = {
['everness:coral_white_sand'] = {
name = 'coral_white_sand',
mod_origin = 'everness',
descritption = 'Coral White Sand Path',
drop = 'everness:coral_white_sand',
tiles = {
'x_obsidianmese_path_dirt_base.png^[colorize:#F9F4FB:170^(everness_coral_white_sand.png^[mask:x_obsidianmese_path_overlay_2.png)',
'x_obsidianmese_path_dirt_base.png^[colorize:#F9F4FB:170',
'x_obsidianmese_dirt_path_side.png^[colorize:#F9F4FB:170'
},
sounds = Everness.node_sound_sand_defaults()
},
}
-- Frosted Icesheet
local path_nodes_frosted_icesheet = {
['everness:frosted_snowblock'] = {
name = 'frosted_snowblock',
mod_origin = 'everness',
descritption = 'Frosted Snow Block Path',
drop = 'everness:frosted_snowblock',
tiles = {
'x_obsidianmese_path_dirt_base.png^[colorize:#FCFCFC:170^(everness_frosted_snow.png^[mask:x_obsidianmese_path_overlay_2.png)',
'x_obsidianmese_path_dirt_base.png^[colorize:#FCFCFC:170',
'x_obsidianmese_dirt_path_side.png^[colorize:#FCFCFC:170'
},
sounds = Everness.node_sound_snow_defaults()
},
}
-- Mineral Waters
local path_nodes_mineral_waters = {
['everness:mineral_sand'] = {
name = 'mineral_sand',
mod_origin = 'everness',
descritption = 'Mineral Sand Path',
drop = 'everness:mineral_sand',
tiles = {
'x_obsidianmese_path_dirt_base.png^[colorize:#E0CEBB:170^(everness_mineral_sand.png^[sheet:2x2:1,1^[mask:x_obsidianmese_path_overlay_2.png)',
'x_obsidianmese_path_dirt_base.png^[colorize:#E0CEBB:170',
'x_obsidianmese_dirt_path_side.png^[colorize:#E0CEBB:170'
},
sounds = Everness.node_sound_sand_defaults()
},
}
-- Bamboo Forest
if Everness.settings.biomes.everness_bamboo_forest.enabled then
x_obsidianmese:register_path_node(path_nodes_bamboo_forest)
end
-- Baobab Savanna
if Everness.settings.biomes.everness_baobab_savanna.enabled then
x_obsidianmese:register_path_node(path_nodes_baobab_savanna)
end
-- Crystal Forest
if Everness.settings.biomes.everness_crystal_forest.enabled then
x_obsidianmese:register_path_node(path_nodes_crystal_forest)
end
if Everness.settings.biomes.everness_crystal_forest_dunes.enabled then
x_obsidianmese:register_path_node(path_nodes_crystal_forest_dunes)
end
if Everness.settings.biomes.everness_crystal_forest_shore.enabled then
x_obsidianmese:register_path_node(path_nodes_crystal_forest_shore)
end
if Everness.settings.biomes.everness_crystal_forest_ocean.enabled then
x_obsidianmese:register_path_node(path_nodes_crystal_forest_ocean)
end
if Everness.settings.biomes.everness_crystal_forest_under.enabled then
x_obsidianmese:register_path_node(path_nodes_crystal_forest_under)
end
-- Forsaken Tundra
if Everness.settings.biomes.everness_forsaken_tundra.enabled then
x_obsidianmese:register_path_node(path_nodes_forsaken_tundra)
end
if Everness.settings.biomes.everness_forsaken_tundra_beach.enabled then
x_obsidianmese:register_path_node(path_nodes_forsaken_tundra_beach)
end
if Everness.settings.biomes.everness_forsaken_tundra_ocean.enabled then
x_obsidianmese:register_path_node(path_nodes_forsaken_tundra_ocean)
end
-- Cursed Lands
if Everness.settings.biomes.everness_cursed_lands.enabled
or Everness.settings.biomes.everness_cursed_lands_dunes.enabled
or Everness.settings.biomes.everness_cursed_lands_ocean.enabled
then
x_obsidianmese:register_path_node(path_nodes_cursed_lands_and_dunes_ocean)
end
-- Coral Forest
if Everness.settings.biomes.everness_coral_forest.enabled
or Everness.settings.biomes.everness_coral_forest_dunes.enabled
then
x_obsidianmese:register_path_node(path_nodes_coral_forest_and_dunes)
end
if Everness.settings.biomes.everness_coral_forest_ocean.enabled then
x_obsidianmese:register_path_node(path_nodes_coral_forest_ocean)
end
-- Forsaken Desert
if Everness.settings.biomes.everness_forsaken_desert.enabled then
x_obsidianmese:register_path_node(path_nodes_forsaken_desert)
end
if Everness.settings.biomes.everness_forsaken_desert_ocean.enabled then
x_obsidianmese:register_path_node(path_nodes_forsaken_desert_ocean)
end
if Everness.settings.biomes.everness_forsaken_desert_under.enabled then
x_obsidianmese:register_path_node(path_nodes_forsaken_desert_under)
end
-- Frosted Icesheet
if Everness.settings.biomes.everness_frosted_icesheet.enabled then
x_obsidianmese:register_path_node(path_nodes_frosted_icesheet)
end
-- Mineral Waters
if Everness.settings.biomes.everness_mineral_waters.enabled then
x_obsidianmese:register_path_node(path_nodes_mineral_waters)
end
local mod_end_time = (core.get_us_time() - mod_start_time) / 1000000
print('[Mod] everness: x_obsidianmese support loaded.. [' .. mod_end_time .. 's]')
@@ -0,0 +1,43 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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 mod_start_time = core.get_us_time()
local allowed_biomes = {}
if Everness.settings.biomes.everness_forsaken_desert.enabled then
table.insert(allowed_biomes, 'everness:forsaken_desert')
end
if Everness.settings.biomes.everness_forsaken_desert_ocean.enabled then
table.insert(allowed_biomes, 'everness:forsaken_desert_ocean')
end
if Everness.settings.biomes.everness_forsaken_desert_under.enabled then
table.insert(allowed_biomes, 'everness:forsaken_desert_under')
end
if Everness.settings.biomes.everness_baobab_savanna.enabled then
table.insert(allowed_biomes, 'everness:baobab_savanna')
end
if #allowed_biomes > 0 then
XTumbleweed:add_allowed_biomes(allowed_biomes)
end
local mod_end_time = (core.get_us_time() - mod_start_time) / 1000000
print('[Mod] everness: x_tumbleweed support loaded.. [' .. mod_end_time .. 's]')
@@ -0,0 +1,555 @@
# Blender v2.83.20 OBJ File: 'everness_barrel_cactus.blend'
# www.blender.org
mtllib everness_barrel_cactus.mtl
o barrel_cactus.vox
v -0.312500 -0.499000 0.312500
v -0.250000 -0.374000 0.500000
v -0.250000 -0.374000 0.375000
v -0.375000 -0.374000 0.375000
v -0.375000 -0.374000 -0.375000
v -0.250000 -0.249000 0.500000
v -0.375000 -0.249000 0.375000
v -0.500000 -0.249000 -0.250000
v -0.250000 -0.249000 -0.500000
v -0.500000 -0.249000 0.250000
v -0.375000 -0.249000 -0.500000
v -0.375000 0.126000 0.500000
v -0.500000 0.126000 0.375000
v -0.500000 0.126000 0.250000
v -0.500000 0.126000 -0.375000
v -0.375000 0.126000 -0.375000
v -0.500000 0.251000 -0.250000
v -0.375000 0.251000 -0.250000
v -0.375000 0.251000 -0.375000
v -0.312500 0.376000 0.312500
v 0.312500 -0.374000 -0.312500
v 0.250000 -0.374000 0.500000
v 0.250000 -0.374000 0.375000
v 0.500000 -0.374000 -0.250000
v 0.250000 -0.374000 -0.500000
v 0.375000 -0.249000 0.250000
v 0.375000 -0.249000 -0.250000
v 0.250000 -0.249000 -0.500000
v 0.375000 -0.249000 0.375000
v 0.500000 -0.249000 -0.250000
v 0.375000 -0.249000 -0.375000
v 0.375000 -0.249000 -0.500000
v 0.500000 0.126000 0.250000
v 0.250000 0.126000 0.500000
v 0.250000 0.126000 0.375000
v 0.375000 0.126000 0.375000
v 0.500000 0.126000 -0.250000
v 0.375000 0.126000 -0.250000
v 0.250000 0.126000 -0.375000
v 0.250000 0.251000 0.500000
v 0.375000 0.251000 0.375000
v 0.375000 0.251000 0.250000
v 0.500000 0.251000 0.250000
v 0.500000 0.251000 -0.250000
v 0.375000 0.251000 -0.375000
v 0.250000 0.251000 -0.500000
v 0.312500 0.251000 0.312500
v 0.312500 0.376000 0.312500
v 0.312500 0.376000 -0.312500
v 0.312500 -0.374000 0.312500
v 0.375000 -0.374000 0.375000
v 0.375000 -0.374000 0.250000
v 0.500000 -0.374000 0.250000
v 0.250000 -0.249000 0.375000
v -0.375000 -0.249000 0.250000
v 0.500000 -0.249000 0.250000
v 0.375000 -0.249000 0.500000
v -0.500000 -0.249000 0.375000
v -0.250000 0.126000 0.500000
v -0.375000 0.126000 0.375000
v 0.500000 0.126000 0.375000
v 0.375000 0.126000 0.250000
v -0.250000 0.251000 0.500000
v -0.250000 0.251000 0.375000
v -0.500000 0.251000 0.250000
v 0.312500 -0.499000 -0.312500
v -0.375000 -0.374000 -0.250000
v 0.375000 -0.374000 -0.375000
v -0.250000 -0.249000 -0.375000
v 0.250000 -0.249000 -0.375000
v -0.500000 -0.249000 -0.375000
v -0.375000 0.126000 -0.500000
v 0.250000 0.126000 -0.500000
v 0.375000 0.126000 -0.500000
v -0.250000 0.126000 -0.375000
v -0.250000 0.126000 -0.500000
v -0.312500 0.251000 -0.312500
v 0.312500 0.251000 -0.312500
v -0.312500 0.376000 -0.312500
v 0.312500 -0.499000 0.312500
v -0.312500 -0.499000 -0.312500
v -0.312500 -0.374000 0.312500
v -0.500000 -0.374000 0.250000
v -0.375000 -0.374000 0.250000
v -0.500000 -0.374000 -0.250000
v 0.375000 -0.374000 -0.250000
v -0.312500 -0.374000 -0.312500
v -0.250000 -0.374000 -0.375000
v 0.250000 -0.374000 -0.375000
v -0.250000 -0.374000 -0.500000
v -0.375000 -0.249000 0.500000
v 0.250000 -0.249000 0.500000
v -0.250000 -0.249000 0.375000
v 0.500000 -0.249000 0.375000
v -0.375000 -0.249000 -0.250000
v 0.500000 -0.249000 -0.375000
v -0.375000 -0.249000 -0.375000
v 0.375000 0.126000 0.500000
v -0.250000 0.126000 0.375000
v -0.375000 0.126000 0.250000
v -0.500000 0.126000 -0.250000
v -0.375000 0.126000 -0.250000
v 0.375000 0.126000 -0.375000
v 0.500000 0.126000 -0.375000
v 0.250000 0.251000 0.375000
v -0.375000 0.251000 0.375000
v -0.312500 0.251000 0.312500
v -0.375000 0.251000 0.250000
v 0.375000 0.251000 -0.250000
v 0.250000 0.251000 -0.375000
v -0.250000 0.251000 -0.375000
v -0.250000 0.251000 -0.500000
v 0.353553 1.375998 0.353553
v 0.353553 0.375999 0.353553
v -0.353553 1.375998 -0.353553
v -0.353553 0.375998 -0.353553
v 0.353553 1.375998 -0.353553
v 0.353553 0.375998 -0.353553
v -0.353553 1.375998 0.353553
v -0.353553 0.375998 0.353553
vt 0.000000 0.375000
vt 0.062500 0.375000
vt 0.062500 0.437500
vt 0.000000 0.437500
vt 0.093750 0.406250
vt 0.406250 0.406250
vt 0.437500 0.437500
vt 0.375000 0.437500
vt 0.375000 0.500000
vt 0.125000 0.500000
vt 0.125000 0.437500
vt 0.062500 0.437500
vt 0.062500 0.375000
vt 0.062500 0.000000
vt 0.125000 0.000000
vt 0.125000 0.062500
vt 0.062500 0.062500
vt 0.000000 0.062500
vt 0.062500 0.125000
vt 0.000000 0.125000
vt 0.500000 0.625000
vt 0.437500 0.625000
vt 0.437500 0.562500
vt 0.500000 0.562500
vt 0.500000 0.625000
vt 0.437500 0.625000
vt 0.437500 0.562500
vt 0.500000 0.562500
vt 0.500000 0.625000
vt 0.500000 0.812500
vt 0.437500 0.812500
vt 0.437500 0.625000
vt 0.406250 0.093750
vt 0.406250 0.406250
vt 0.093750 0.406250
vt 0.093750 0.093750
vt 0.500000 0.125000
vt 0.437500 0.125000
vt 0.437500 0.062500
vt 0.500000 0.062500
vt 0.062500 0.625000
vt 0.062500 0.562500
vt 0.125000 0.562500
vt 0.125000 0.625000
vt 0.125000 0.812500
vt 0.125000 0.875000
vt 0.062500 0.875000
vt 0.062500 0.812500
vt 0.500000 0.812500
vt 0.500000 0.875000
vt 0.437500 0.875000
vt 0.437500 0.812500
vt 0.437500 0.125000
vt 0.437500 0.062500
vt 0.500000 0.062500
vt 0.500000 0.125000
vt 0.093750 0.406250
vt 0.406250 0.406250
vt 0.375000 0.437500
vt 0.375000 0.500000
vt 0.125000 0.500000
vt 0.125000 0.437500
vt 0.062500 0.437500
vt 0.062500 0.375000
vt 0.000000 0.375000
vt 0.000000 0.125000
vt 0.062500 0.125000
vt 0.093750 0.093750
vt 0.062500 0.812500
vt 0.062500 0.875000
vt 0.000000 0.875000
vt 0.000000 0.812500
vt 0.062500 0.812500
vt 0.062500 0.875000
vt 0.000000 0.875000
vt 0.000000 0.812500
vt 0.437500 0.875000
vt 0.375000 0.875000
vt 0.375000 0.812500
vt 0.437500 0.812500
vt 0.437500 0.625000
vt 0.375000 0.625000
vt 0.375000 0.562500
vt 0.437500 0.562500
vt 0.125000 0.562500
vt 0.125000 0.625000
vt 0.062500 0.625000
vt 0.062500 0.562500
vt 0.062500 0.625000
vt 0.000000 0.625000
vt 0.000000 0.562500
vt 0.062500 0.562500
vt 0.062500 0.437500
vt 0.125000 0.437500
vt 0.125000 0.500000
vt 0.062500 0.500000
vt -0.000000 0.875000
vt -0.000000 0.812500
vt 0.062500 0.812500
vt 0.062500 0.875000
vt 0.062500 0.375000
vt 0.000000 0.437500
vt 0.000000 0.375000
vt 0.437500 0.375000
vt 0.500000 0.375000
vt 0.500000 0.437500
vt 0.437500 0.437500
vt 0.000000 0.875000
vt 0.000000 0.812500
vt 0.062500 0.812500
vt 0.062500 0.875000
vt 0.062500 0.562500
vt 0.062500 0.625000
vt -0.000000 0.625000
vt -0.000000 0.562500
vt 0.500000 0.875000
vt 0.437500 0.875000
vt 0.437500 0.812500
vt 0.500000 0.812500
vt 0.375000 0.500000
vt 0.375000 0.437500
vt 0.437500 0.500000
vt 0.125000 0.812500
vt 0.125000 0.875000
vt 0.062500 0.875000
vt 0.062500 0.812500
vt 0.375000 0.812500
vt 0.437500 0.875000
vt 0.375000 0.875000
vt 0.406250 0.562500
vt 0.093750 0.562500
vt 0.093750 0.500000
vt 0.406250 0.500000
vt 0.406250 0.937500
vt 0.093750 0.937500
vt 0.093750 0.875000
vt 0.406250 0.875000
vt 0.062500 0.625000
vt 0.125000 0.625000
vt 0.125000 0.562500
vt 0.375000 0.562500
vt 0.375000 0.625000
vt 0.437500 0.625000
vt 0.437500 0.812500
vt 0.375000 0.812500
vt 0.375000 0.875000
vt 0.125000 0.875000
vt 0.125000 0.812500
vt 0.062500 0.812500
vt 0.375000 0.875000
vt 0.375000 0.812500
vt 0.437500 0.812500
vt 0.437500 0.875000
vt 0.500000 0.625000
vt 0.500000 0.812500
vt 0.125000 0.062500
vt 0.125000 0.000000
vt 0.375000 0.000000
vt 0.375000 0.062500
vt 0.437500 0.062500
vt 0.437500 0.125000
vt 0.500000 0.125000
vt 0.500000 0.375000
vt 0.437500 0.375000
vt 0.437500 0.437500
vt 0.406250 0.093750
vt 0.062500 0.062500
vt 0.125000 0.000000
vt 0.125000 0.062500
vt 0.062500 0.062500
vt 0.062500 0.000000
vt 0.062500 0.500000
vt 0.125000 0.437500
vt 0.125000 0.500000
vt 0.093750 0.562500
vt 0.093750 0.500000
vt 0.406250 0.500000
vt 0.406250 0.562500
vt 0.125000 0.812500
vt 0.125000 0.875000
vt 0.062500 0.875000
vt 0.062500 0.812500
vt 0.375000 0.625000
vt 0.375000 0.562500
vt 0.437500 0.562500
vt 0.500000 0.812500
vt 0.500000 0.875000
vt 0.437500 0.875000
vt 0.437500 0.812500
vt 0.000000 0.812500
vt 0.000000 0.625000
vt 0.062500 0.625000
vt 0.125000 0.625000
vt 0.062500 0.625000
vt 0.062500 0.562500
vt 0.125000 0.562500
vt 0.437500 0.437500
vt 0.437500 0.375000
vt 0.500000 0.375000
vt 0.500000 0.437500
vt 0.093750 0.875000
vt 0.406250 0.875000
vt 0.406250 0.937500
vt 0.093750 0.937500
vt 0.062500 0.125000
vt 0.000000 0.125000
vt 0.000000 0.062500
vt 0.406250 0.500000
vt 0.406250 0.562500
vt 0.093750 0.562500
vt 0.093750 0.500000
vt 0.375000 0.000000
vt 0.437500 0.000000
vt 0.375000 0.062500
vt 0.500000 0.625000
vt 0.437500 0.625000
vt 0.437500 0.562500
vt 0.500000 0.562500
vt 0.500000 0.625000
vt 0.437500 0.625000
vt 0.437500 0.562500
vt 0.500000 0.562500
vt 0.000000 0.812500
vt 0.000000 0.625000
vt 0.437500 0.500000
vt 0.375000 0.500000
vt 0.375000 0.437500
vt 0.125000 0.812500
vt 0.125000 0.875000
vt 0.062500 0.875000
vt 0.062500 0.812500
vt 0.375000 0.062500
vt 0.375000 0.000000
vt 0.437500 0.000000
vt 0.437500 0.875000
vt 0.437500 0.812500
vt 0.500000 0.812500
vt 0.500000 0.875000
vt 0.062500 0.625000
vt 0.000000 0.625000
vt 0.000000 0.562500
vt 0.062500 0.562500
vt 0.000000 0.812500
vt 0.000000 0.625000
vt 0.375000 0.562500
vt 0.375000 0.625000
vt 0.437500 0.625000
vt 0.437500 0.812500
vt 0.375000 0.812500
vt 0.375000 0.875000
vt 0.125000 0.875000
vt 0.125000 0.812500
vt 0.062500 0.812500
vt 0.062500 0.625000
vt 0.125000 0.625000
vt 0.125000 0.562500
vt 0.500000 0.625000
vt 0.500000 0.812500
vt 0.437500 0.812500
vt 0.437500 0.625000
vt 0.375000 0.812500
vt 0.375000 0.875000
vt 0.125000 0.875000
vt 0.125000 0.812500
vt 0.062500 0.812500
vt 0.062500 0.625000
vt 0.125000 0.625000
vt 0.125000 0.562500
vt 0.375000 0.562500
vt 0.375000 0.625000
vt 0.437500 0.625000
vt 0.437500 0.812500
vt 0.406250 0.093750
vt 0.406250 0.406250
vt 0.093750 0.406250
vt 0.093750 0.093750
vt 0.406250 0.875000
vt 0.406250 0.937500
vt 0.093750 0.937500
vt 0.093750 0.875000
vt 0.125000 0.625000
vt 0.062500 0.562500
vt 0.125000 0.562500
vt 0.437500 0.125000
vt 0.500000 0.125000
vt 0.500000 0.375000
vt 0.437500 0.375000
vt 0.406250 0.093750
vt 0.093750 0.093750
vt 0.000000 0.375000
vt 0.000000 0.125000
vt 0.062500 0.125000
vt 0.062500 0.062500
vt 0.125000 0.062500
vt 0.125000 0.000000
vt 0.375000 0.000000
vt 0.375000 0.062500
vt 0.437500 0.062500
vt 0.437500 0.625000
vt 0.375000 0.625000
vt 0.375000 0.562500
vt 0.437500 0.562500
vt 0.437500 0.875000
vt 0.375000 0.875000
vt 0.375000 0.812500
vt 0.500000 0.625000
vt 0.500000 0.812500
vt -0.000000 0.812500
vt -0.000000 0.625000
vt 0.062500 0.625000
vt 0.000000 0.625000
vt 0.000000 0.562500
vt 0.062500 0.562500
vt 0.375000 0.625000
vt 0.375000 0.562500
vt 0.437500 0.562500
vt 0.406250 0.937500
vt 0.093750 0.937500
vt 0.093750 0.875000
vt 0.406250 0.875000
vt 0.375000 0.812500
vt 0.375000 0.875000
vt 0.125000 0.875000
vt 0.125000 0.812500
vt 0.062500 0.812500
vt 0.062500 0.625000
vt 0.125000 0.625000
vt 0.125000 0.562500
vt 0.375000 0.562500
vt 0.375000 0.625000
vt 0.437500 0.625000
vt 0.437500 0.812500
vt 0.093750 0.562500
vt 0.093750 0.500000
vt 0.406250 0.500000
vt 0.406250 0.562500
vt 0.500000 1.000000
vt 0.500000 0.500000
vt 1.000000 0.500000
vt 1.000000 1.000000
vt 0.500000 1.000000
vt 0.500000 0.500000
vt 1.000000 0.500000
vt 1.000000 1.000000
vn 0.0000 1.0000 0.0000
vn 0.0000 -1.0000 0.0000
vn -1.0000 0.0000 0.0000
vn 1.0000 0.0000 0.0000
vn 0.0000 0.0000 1.0000
vn 0.0000 0.0000 -1.0000
vn 0.7071 0.0000 -0.7071
vn -0.7071 -0.0000 -0.7071
g barrel_cactus.vox_barrel_cactus.vox_cactus
usemtl cactus
s off
f 101/1/1 102/2/1 16/3/1 15/4/1
f 77/5/1 78/6/1 45/7/1 110/8/1 46/9/1 112/10/1 111/11/1 19/12/1 18/13/1
f 11/14/2 9/15/2 69/16/2 97/17/2
f 71/18/2 97/17/2 95/19/2 8/20/2
f 6/21/3 93/22/3 3/23/3 2/24/3
f 28/25/4 70/26/4 89/27/4 25/28/4
f 94/29/5 61/30/5 36/31/5 29/32/5
f 66/33/2 80/34/2 1/35/2 81/36/2
f 30/37/2 27/38/2 31/39/2 96/40/2
f 31/41/6 68/42/6 89/43/6 70/44/6
f 102/45/3 18/46/3 19/47/3 16/48/3
f 33/49/5 43/50/5 42/51/5 62/52/5
f 62/53/1 36/54/1 61/55/1 33/56/1
f 82/57/2 50/58/2 23/59/2 22/60/2 2/61/2 3/62/2 4/63/2 84/64/2 83/65/2 85/66/2 67/67/2 87/68/2
f 38/69/6 109/70/6 44/71/6 37/72/6
f 100/73/5 108/74/5 65/75/5 14/76/5
f 106/77/3 108/78/3 100/79/3 60/80/3
f 31/81/4 27/82/4 86/83/4 68/84/4
f 52/85/4 26/86/4 29/87/4 51/88/4
f 55/89/5 10/90/5 83/91/5 84/92/5
f 7/93/2 93/94/2 6/95/2 91/96/2
f 40/97/4 34/98/4 35/99/4 105/100/4
f 55/101/2 7/93/2 58/102/2 10/103/2
f 26/104/2 56/105/2 94/106/2 29/107/2
f 112/108/3 76/109/3 75/110/3 111/111/3
f 23/112/4 54/113/4 92/114/4 22/115/4
f 63/116/3 64/117/3 99/118/3 59/119/3
f 92/120/2 54/121/2 29/107/2 57/122/2
f 39/123/6 110/124/6 45/125/6 103/126/6
f 35/127/5 36/31/5 41/128/5 105/129/5
f 87/130/6 21/131/6 66/132/6 81/133/6
f 48/134/5 20/135/5 107/136/5 47/137/5
f 91/138/5 6/139/5 2/140/5 22/141/5 92/142/5 57/143/5 98/144/5 34/145/5 40/146/5 63/147/5 59/148/5 12/149/5
f 109/150/4 38/151/4 103/152/4 45/153/4
f 103/152/4 31/81/4 32/154/4 74/155/4
f 88/156/2 90/157/2 25/158/2 89/159/2 68/160/2 86/161/2 24/162/2 53/163/2 52/164/2 51/165/2 23/59/2 50/58/2 21/166/2 87/68/2 67/67/2 5/167/2
f 59/168/1 99/169/1 60/170/1 12/171/1
f 72/172/1 16/3/1 75/173/1 76/174/1
f 82/175/5 1/176/5 80/177/5 50/178/5
f 99/179/5 64/180/5 106/181/5 60/182/5
f 54/183/5 23/184/5 51/185/5 29/32/5
f 101/186/6 17/187/6 18/188/6 102/189/6
f 16/48/3 72/190/3 11/191/3 97/192/3
f 93/193/5 7/194/5 4/195/5 3/196/5
f 103/197/1 38/198/1 37/199/1 104/200/1
f 78/201/6 77/202/6 79/203/6 49/204/6
f 100/205/1 14/206/1 13/207/1 60/170/1
f 66/208/4 21/209/4 50/210/4 80/211/4
f 28/212/2 32/213/2 31/39/2 70/214/2
f 56/215/5 26/216/5 52/217/5 53/218/5
f 8/219/6 95/220/6 67/221/6 85/222/6
f 13/223/5 58/224/5 7/194/5 60/182/5
f 103/197/1 74/225/1 73/226/1 39/227/1
f 62/228/4 42/229/4 41/230/4 36/231/4
f 35/232/1 34/233/1 98/234/1 36/54/1
f 110/235/4 39/236/4 73/237/4 46/238/4
f 27/239/6 30/240/6 24/241/6 86/242/6
f 103/126/6 104/243/6 96/244/6 31/41/6
f 83/245/3 10/246/3 58/247/3 13/248/3 14/249/3 65/250/3 17/251/3 101/252/3 15/253/3 71/254/3 8/255/3 85/256/3
f 71/257/6 15/258/6 16/259/6 97/260/6
f 76/261/6 112/262/6 46/263/6 73/264/6 74/265/6 32/266/6 28/267/6 25/268/6 90/269/6 9/270/6 11/271/6 72/272/6
f 48/273/1 49/274/1 79/275/1 20/276/1
f 78/277/4 49/278/4 48/279/4 47/280/4
f 95/281/3 97/192/3 5/282/3 67/283/3
f 42/284/1 43/285/1 44/286/1 109/287/1 45/7/1 78/6/1 47/288/1 107/289/1 77/5/1 18/13/1 17/290/1 65/291/1 108/292/1 106/293/1 64/294/1 63/295/1 40/296/1 105/297/1 41/298/1
f 7/299/3 55/300/3 84/301/3 4/302/3
f 16/259/6 19/303/6 111/304/6 75/305/6
f 91/306/3 12/307/3 60/80/3 7/299/3
f 98/308/4 57/309/4 29/87/4 36/231/4
f 69/310/3 9/311/3 90/312/3 88/313/3
f 97/260/6 69/314/6 88/315/6 5/316/6
f 20/317/3 79/318/3 77/319/3 107/320/3
f 37/321/4 44/322/4 43/323/4 33/324/4 61/325/4 94/326/4 56/327/4 53/328/4 24/329/4 30/330/4 96/331/4 104/332/4
f 87/333/3 81/334/3 1/335/3 82/336/3
f 113/337/7 114/338/7 116/339/7 115/340/7
f 117/341/8 118/342/8 120/343/8 119/344/8
@@ -0,0 +1,38 @@
# Blender 3.3.1
# www.blender.org
mtllib everness_cave_flower.mtl
o Cube
v 0.000000 -0.499000 0.000000
v -0.500000 -0.499000 0.500000
v 0.500000 -0.229136 -0.500000
v 0.500000 -0.499000 0.500000
v -0.500000 -0.229136 -0.500000
v -0.500000 -0.499000 -0.500000
v 0.500000 -0.229136 0.500000
v 0.500000 -0.499000 -0.500000
v -0.500000 -0.229136 0.500000
vn -0.0000 1.0000 -0.0000
vn -0.0000 0.8800 -0.4750
vn 0.4750 0.8800 -0.0000
vn -0.0000 0.8800 0.4750
vn -0.4750 0.8800 -0.0000
vt 0.250000 1.000000
vt 1.000000 1.000000
vt -0.000000 0.187500
vt 0.500000 0.187500
vt 0.500000 1.000000
vt -0.000000 0.187500
vt 0.500000 0.187500
vt 1.000000 -0.000000
vt 0.500000 0.187500
vt -0.000000 0.187500
vt 0.500000 -0.000000
vt -0.000000 0.187500
vt 0.500000 0.187500
s 0
usemtl flower
f 8/11/1 6/8/1 2/2/1 4/5/1
f 9/12/2 7/9/2 1/1/2
f 5/6/3 9/13/3 1/1/3
f 3/3/4 5/7/4 1/1/4
f 7/10/5 3/4/5 1/1/5
@@ -0,0 +1,61 @@
# Blender v2.83.20 OBJ File: 'everness_cave_flower_with_particles.blend'
# www.blender.org
mtllib everness_cave_flower_with_particles.mtl
o Cube
v 0.000000 -0.499000 0.000000
v -0.500000 -0.499000 0.500000
v 0.500000 -0.229136 -0.500000
v 0.500000 -0.499000 0.500000
v -0.500000 -0.229136 -0.500000
v -0.500000 -0.499000 -0.500000
v 0.500000 -0.229136 0.500000
v 0.500000 -0.499000 -0.500000
v -0.500000 -0.229136 0.500000
v 0.353553 -0.499000 0.353553
v -0.353553 -0.499000 -0.353553
v 0.353553 1.501000 0.353553
v -0.353553 1.501000 -0.353553
v -0.353553 -0.499000 0.353553
v 0.353553 -0.499000 -0.353553
v -0.353553 1.501000 0.353553
v 0.353553 1.501000 -0.353553
vt 0.500000 1.000000
vt 0.500000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt -0.000000 0.187500
vt 0.500000 0.187500
vt 0.250000 1.000000
vt -0.000000 0.187500
vt 0.500000 0.187500
vt -0.000000 0.187500
vt 0.500000 0.187500
vt -0.000000 0.187500
vt 0.500000 0.187500
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vn 0.0000 1.0000 0.0000
vn 0.0000 0.8800 -0.4750
vn 0.4750 0.8800 0.0000
vn 0.0000 0.8800 0.4750
vn -0.4750 0.8800 0.0000
vn 0.7071 -0.0000 -0.7071
vn 0.7071 -0.0000 0.7071
g Cube_Cube_flower
usemtl flower
s off
f 8/1/1 6/2/1 2/3/1 4/4/1
f 9/5/2 7/6/2 1/7/2
f 5/8/3 9/9/3 1/7/3
f 3/10/4 5/11/4 1/7/4
f 7/12/5 3/13/5 1/7/5
g Cube_Cube_particles
usemtl particles
f 13/14/6 12/15/6 10/16/6 11/17/6
f 17/18/7 16/19/7 14/20/7 15/21/7
@@ -0,0 +1,375 @@
# Blender v2.83.20 OBJ File: 'everness_ceramic_pot.blend'
# www.blender.org
mtllib everness_ceramic_pot.mtl
o everness_ceramic_pot.vox
v -0.375000 -0.499000 0.375000
v -0.437500 -0.436500 0.437500
v -0.437500 0.501000 0.125000
v -0.250000 0.501000 0.125000
v -0.250000 0.501000 -0.250000
v -0.312500 0.563500 0.312500
v -0.312500 0.751000 -0.312500
v 0.375000 -0.499000 0.375000
v 0.437500 -0.436500 0.437500
v 0.437500 0.501000 0.437500
v 0.312500 0.563500 0.312500
v -0.375000 -0.436500 0.375000
v 0.375000 -0.436500 0.375000
v -0.250000 0.501000 0.437500
v -0.250000 0.501000 0.250000
v -0.250000 0.563500 0.250000
v 0.250000 0.563500 0.250000
v -0.312500 0.751000 0.312500
v -0.187500 0.751000 0.312500
v 0.312500 0.751000 0.312500
v -0.187500 0.751000 -0.187500
v 0.187500 0.751000 -0.187500
v -0.375000 -0.436500 -0.375000
v -0.250000 -0.436500 -0.375000
v 0.375000 -0.499000 -0.375000
v -0.437500 -0.436500 -0.437500
v 0.437500 0.501000 -0.437500
v -0.312500 0.563500 -0.312500
v 0.062500 0.563500 -0.312500
v -0.062500 0.751000 0.187500
v 0.312500 0.751000 -0.312500
v -0.375000 -0.499000 -0.375000
v -0.437500 -0.436500 -0.375000
v -0.250000 -0.436500 -0.437500
v 0.375000 -0.436500 -0.375000
v 0.437500 -0.436500 -0.437500
v -0.312500 0.563500 -0.250000
v -0.250000 0.563500 -0.250000
v 0.062500 0.563500 -0.250000
v 0.250000 0.563500 -0.250000
v 0.312500 0.563500 -0.312500
v -0.437500 0.501000 0.437500
v 0.250000 0.501000 0.250000
v 0.250000 0.501000 -0.250000
v -0.437500 0.501000 -0.437500
v -0.062500 0.751000 0.312500
v -0.187500 0.751000 0.187500
v 0.187500 0.751000 0.187500
v 0.437500 -0.436500 0.437500
v 0.437500 -0.436500 -0.437500
v 0.437500 0.501000 0.437500
v 0.437500 0.501000 -0.437500
v -0.375000 -0.499000 0.375000
v -0.437500 -0.436500 0.437500
v -0.437500 0.501000 0.125000
v -0.250000 0.501000 0.125000
v -0.250000 0.501000 -0.250000
v -0.312500 0.563500 0.312500
v -0.312500 0.751000 -0.312500
v 0.375000 -0.499000 0.375000
v 0.437500 -0.436500 0.437500
v 0.437500 0.501000 0.437500
v 0.312500 0.563500 0.312500
v -0.187500 0.626000 -0.187500
v -0.375000 -0.436500 0.375000
v 0.375000 -0.436500 0.375000
v -0.250000 0.501000 0.437500
v -0.250000 0.501000 0.250000
v -0.250000 0.563500 0.250000
v 0.250000 0.563500 0.250000
v 0.187500 0.626000 -0.187500
v -0.312500 0.751000 0.312500
v -0.187500 0.751000 0.312500
v 0.312500 0.751000 0.312500
v -0.187500 0.751000 -0.187500
v 0.187500 0.751000 -0.187500
v -0.375000 -0.436500 -0.375000
v -0.250000 -0.436500 -0.375000
v 0.375000 -0.499000 -0.375000
v -0.437500 -0.436500 -0.437500
v 0.437500 0.501000 -0.437500
v -0.312500 0.563500 -0.312500
v 0.062500 0.563500 -0.312500
v -0.187500 0.626000 0.187500
v -0.062500 0.751000 0.187500
v 0.312500 0.751000 -0.312500
v -0.375000 -0.499000 -0.375000
v -0.437500 -0.436500 -0.375000
v -0.250000 -0.436500 -0.437500
v 0.375000 -0.436500 -0.375000
v 0.437500 -0.436500 -0.437500
v -0.312500 0.563500 -0.250000
v -0.250000 0.563500 -0.250000
v 0.062500 0.563500 -0.250000
v 0.250000 0.563500 -0.250000
v 0.312500 0.563500 -0.312500
v -0.437500 0.501000 0.437500
v 0.250000 0.501000 0.250000
v 0.250000 0.501000 -0.250000
v -0.437500 0.501000 -0.437500
v 0.187500 0.626000 0.187500
v -0.062500 0.751000 0.312500
v -0.187500 0.751000 0.187500
v 0.187500 0.751000 0.187500
v 0.437500 -0.436500 0.437500
v 0.437500 -0.436500 -0.437500
v 0.437500 0.501000 0.437500
v 0.437500 0.501000 -0.437500
vt 0.437500 0.250000
vt 0.375000 0.218750
vt 0.437500 0.218750
vt 0.000000 0.000000
vt 0.093750 0.000000
vt 0.093750 0.046875
vt 0.437500 0.000000
vt 0.437500 0.218750
vt 0.343750 0.171875
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.843750 0.218750
vt 0.843750 0.015625
vt 0.812500 0.031250
vt 0.625000 0.375000
vt 0.312500 0.375000
vt 0.562500 0.343750
vt 0.468750 0.203125
vt 0.812500 0.031250
vt 0.468750 0.031250
vt 0.531250 0.218750
vt 0.531250 0.203125
vt 0.468750 0.203125
vt 0.906250 0.234375
vt 0.937500 0.375000
vt 0.937500 0.218750
vt 0.812500 0.375000
vt 0.812500 0.359375
vt 0.656250 0.359375
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.031250 0.390625
vt 0.437500 0.390625
vt 0.281250 0.625000
vt 0.093750 0.640625
vt 0.093750 0.625000
vt 0.281250 0.625000
vt 0.062500 0.687500
vt 0.062500 0.640625
vt 0.093750 0.640625
vt 0.062500 0.218750
vt 0.250000 0.250000
vt 0.250000 0.218750
vt 0.843750 0.687500
vt 0.781250 0.703125
vt 0.468750 0.687500
vt 0.343750 0.937500
vt 0.093750 0.953125
vt 0.093750 0.937500
vt 0.062500 0.343750
vt 0.250000 0.375000
vt 0.062500 0.375000
vt 0.875000 0.390625
vt 0.531250 0.625000
vt 0.031250 0.375000
vt 0.406250 0.390625
vt 0.031250 0.390625
vt 0.781250 0.625000
vt 0.531250 0.640625
vt 0.531250 0.625000
vt 0.406250 0.687500
vt 0.031250 0.703125
vt 0.031250 0.687500
vt 0.312500 0.343750
vt 0.250000 0.250000
vt 0.312500 0.250000
vt 0.812500 0.640625
vt 0.812500 0.687500
vt 0.625000 0.687500
vt 0.437500 0.937500
vt 0.437500 0.703125
vt 0.781250 0.703125
vt 0.625000 0.953125
vt 0.531250 0.937500
vt 0.781250 0.937500
vt 0.500000 1.000000
vt 0.500000 0.953125
vt 0.625000 0.953125
vt 0.062500 0.250000
vt 0.000000 0.281250
vt 0.062500 0.343750
vt 0.375000 0.953125
vt 0.062500 1.000000
vt 0.062500 0.953125
vt 0.250000 0.343750
vt 0.062500 0.343750
vt 0.843750 0.375000
vt 0.468750 0.390625
vt 0.468750 0.375000
vt 0.437500 0.937500
vt 0.000000 0.703125
vt 0.437500 0.703125
vt 0.375000 0.250000
vt 0.093750 0.078125
vt 0.000000 0.078125
vt 0.343750 0.046875
vt 0.000000 0.218750
vt 0.093750 0.171875
vt 0.812500 0.203125
vt 0.437500 0.015625
vt 0.437500 0.203125
vt 0.468750 0.031250
vt 0.312500 0.218750
vt 0.375000 0.343750
vt 0.562500 0.250000
vt 0.625000 0.218750
vt 0.812500 0.203125
vt 0.437500 0.218750
vt 0.625000 0.218750
vt 0.625000 0.359375
vt 0.656250 0.234375
vt 0.906250 0.359375
vt 0.625000 0.375000
vt 0.437500 0.625000
vt 0.000000 0.625000
vt 0.000000 0.390625
vt 0.343750 0.625000
vt 0.343750 0.640625
vt 0.375000 0.640625
vt 0.375000 0.687500
vt 0.062500 0.250000
vt 0.843750 0.703125
vt 0.468750 0.703125
vt 0.343750 0.953125
vt 0.250000 0.343750
vt 0.875000 0.625000
vt 0.406250 0.375000
vt 0.781250 0.640625
vt 0.406250 0.703125
vt 0.562500 0.687500
vt 0.500000 0.640625
vt 0.500000 0.687500
vt 0.875000 0.703125
vt 0.875000 0.937500
vt 0.781250 0.953125
vt 0.531250 0.953125
vt 0.812500 0.953125
vt 0.812500 1.000000
vt -0.000000 0.250000
vt 0.000000 0.343750
vt 0.375000 1.000000
vt 0.843750 0.390625
vt 0.000000 0.937500
vn 0.0000 1.0000 0.0000
vn 0.0000 0.0000 1.0000
vn 0.0000 -1.0000 0.0000
vn -1.0000 0.0000 0.0000
vn 0.0000 0.0000 -1.0000
vn 1.0000 0.0000 0.0000
usemtl pot
s off
f 30/1/1 19/2/1 46/3/1
f 42/4/1 14/5/1 15/6/1
f 10/7/1 27/8/1 44/9/1
f 27/10/2 51/11/2 52/12/2
f 36/13/3 9/14/3 13/15/3
f 31/16/1 7/17/1 22/18/1
f 32/19/3 8/20/3 1/21/3
f 34/22/3 24/23/3 23/24/3
f 17/25/3 41/26/3 11/27/3
f 29/28/3 39/29/3 38/30/3
f 10/31/2 49/32/2 51/11/2
f 36/33/2 52/12/2 50/34/2
f 9/35/2 50/34/2 49/32/2
f 88/36/4 54/37/4 55/38/4
f 93/39/4 57/40/4 56/41/4
f 59/42/4 82/43/4 92/44/4
f 76/45/4 101/46/4 104/47/4
f 87/48/5 78/49/5 79/50/5
f 99/51/6 70/52/6 98/53/6
f 84/54/6 75/55/6 103/56/6
f 61/57/2 67/58/2 54/37/2
f 87/59/4 65/60/4 77/61/4
f 98/62/2 69/63/2 68/64/2
f 79/65/6 66/66/6 60/67/6
f 75/68/2 71/69/2 76/70/2
f 63/71/2 74/72/2 102/73/2
f 81/74/5 91/75/5 89/76/5
f 94/77/5 99/78/5 57/79/5
f 86/80/5 96/81/5 83/82/5
f 84/83/5 85/84/5 101/85/5
f 96/86/6 74/87/6 63/88/6
f 84/83/1 71/89/1 64/90/1
f 60/91/2 65/92/2 53/93/2
f 108/94/6 105/95/6 106/96/6
f 30/1/1 47/97/1 19/2/1
f 4/98/1 3/99/1 15/6/1
f 3/99/1 42/4/1 15/6/1
f 43/100/1 15/6/1 14/5/1
f 45/101/1 3/99/1 5/102/1
f 3/99/1 4/98/1 5/102/1
f 43/100/1 14/5/1 10/7/1
f 45/101/1 5/102/1 44/9/1
f 44/9/1 43/100/1 10/7/1
f 27/8/1 45/101/1 44/9/1
f 27/10/2 10/31/2 51/11/2
f 24/23/3 34/22/3 35/103/3
f 34/22/3 36/13/3 35/103/3
f 2/104/3 33/105/3 12/106/3
f 33/105/3 23/24/3 12/106/3
f 2/104/3 12/106/3 13/15/3
f 13/15/3 35/103/3 36/13/3
f 9/14/3 2/104/3 13/15/3
f 7/17/1 18/107/1 47/97/1
f 18/107/1 19/2/1 47/97/1
f 47/97/1 21/108/1 7/17/1
f 30/1/1 46/3/1 48/109/1
f 46/3/1 20/110/1 48/109/1
f 22/18/1 48/109/1 20/110/1
f 7/17/1 21/108/1 22/18/1
f 22/18/1 20/110/1 31/16/1
f 32/19/3 25/111/3 8/20/3
f 33/105/3 26/112/3 23/24/3
f 26/112/3 34/22/3 23/24/3
f 6/113/3 37/114/3 16/115/3
f 37/114/3 38/30/3 16/115/3
f 39/29/3 29/28/3 40/116/3
f 29/28/3 41/26/3 40/116/3
f 11/27/3 6/113/3 16/115/3
f 17/25/3 40/116/3 41/26/3
f 11/27/3 16/115/3 17/25/3
f 37/114/3 28/117/3 38/30/3
f 28/117/3 29/28/3 38/30/3
f 10/31/2 9/35/2 49/32/2
f 36/33/2 27/10/2 52/12/2
f 9/35/2 36/33/2 50/34/2
f 97/118/4 55/38/4 54/37/4
f 55/38/4 100/119/4 88/36/4
f 100/119/4 80/120/4 88/36/4
f 68/121/4 69/122/4 56/41/4
f 69/122/4 93/39/4 56/41/4
f 58/123/4 72/124/4 92/44/4
f 72/124/4 59/42/4 92/44/4
f 76/45/4 71/125/4 101/46/4
f 77/126/5 78/49/5 87/48/5
f 78/49/5 90/127/5 79/50/5
f 99/51/6 95/128/6 70/52/6
f 84/54/6 64/129/6 75/55/6
f 62/130/2 67/58/2 61/57/2
f 67/58/2 97/118/2 54/37/2
f 87/59/4 53/131/4 65/60/4
f 98/62/2 70/132/2 69/63/2
f 79/65/6 90/133/6 66/66/6
f 75/68/2 64/129/2 71/69/2
f 102/73/2 73/134/2 58/135/2
f 73/134/2 72/136/2 58/135/2
f 102/73/2 58/135/2 63/71/2
f 89/76/5 80/137/5 100/138/5
f 100/138/5 81/74/5 89/76/5
f 57/79/5 93/139/5 94/77/5
f 94/77/5 95/140/5 99/78/5
f 82/141/5 59/142/5 83/82/5
f 59/142/5 86/80/5 83/82/5
f 103/143/5 85/84/5 84/83/5
f 85/84/5 104/144/5 101/85/5
f 96/86/6 86/145/6 74/87/6
f 84/83/1 101/46/1 71/89/1
f 60/91/2 66/146/2 65/92/2
f 108/94/6 107/147/6 105/95/6
@@ -0,0 +1,467 @@
# Blender 4.4.3
# www.blender.org
mtllib everness_chest_closed.mtl
o Chest
v -0.500000 0.500000 0.500000
v -0.500000 -0.500000 0.500000
v -0.500000 0.500000 -0.500000
v -0.500000 -0.500000 -0.500000
v 0.500000 0.500000 0.500000
v 0.500000 -0.500000 0.500000
v 0.500000 0.500000 -0.500000
v 0.500000 -0.500000 -0.500000
v -0.062500 0.000000 -0.437500
v -0.125000 0.250000 -0.500000
v 0.062500 0.250000 -0.437500
v 0.125000 0.250000 -0.437500
v 0.125000 0.250000 -0.500000
v 0.125000 0.125000 -0.500000
v 0.062500 -0.125000 -0.437500
v -0.125000 0.125000 -0.500000
v -0.125000 0.125000 -0.437500
v -0.125000 0.250000 -0.437500
v 0.500000 -0.500000 -0.437500
v 0.437500 -0.500000 0.500000
v -0.437500 -0.500000 -0.500000
v -0.437500 0.500000 0.500000
v -0.062500 0.000000 -0.500000
v -0.062500 0.250000 -0.500000
v 0.062500 0.062500 -0.437500
v 0.062500 -0.062500 -0.437500
v 0.125000 0.125000 -0.437500
v -0.437500 0.500000 -0.500000
v -0.500000 0.500000 0.437500
v 0.437500 -0.500000 -0.500000
v 0.500000 0.500000 -0.437500
v 0.437500 0.500000 0.500000
v -0.500000 -0.500000 -0.437500
v 0.062500 0.000000 -0.500000
v -0.125000 -0.062500 -0.437500
v 0.062500 0.250000 -0.500000
v 0.125000 0.187500 -0.437500
v 0.125000 0.187500 -0.500000
v 0.437500 0.125000 -0.500000
v 0.500000 0.125000 0.437500
v -0.500000 0.125000 -0.437500
v -0.437500 0.125000 0.500000
v -0.437500 0.125000 -0.437500
v 0.437500 0.125000 0.500000
v -0.500000 0.125000 0.437500
v 0.500000 0.125000 -0.437500
v 0.062500 -0.125000 -0.500000
v 0.125000 -0.062500 -0.500000
v 0.125000 -0.062500 -0.437500
v -0.437500 0.125000 -0.500000
v -0.125000 0.062500 -0.500000
v -0.125000 0.187500 -0.500000
v 0.062500 0.187500 -0.437500
v -0.062500 -0.125000 -0.500000
v -0.125000 -0.062500 -0.500000
v 0.062500 0.000000 -0.437500
v 0.437500 -0.437500 -0.437500
v 0.437500 -0.500000 0.437500
v -0.062500 0.250000 -0.437500
v -0.062500 0.062500 -0.437500
v -0.437500 0.437500 -0.437500
v -0.437500 0.437500 0.437500
v 0.437500 0.500000 0.437500
v -0.437500 0.500000 0.437500
v -0.437500 0.500000 -0.437500
v -0.062500 0.062500 -0.500000
v -0.437500 0.187500 -0.500000
v -0.437500 0.437500 -0.500000
v -0.437500 -0.437500 -0.500000
v -0.062500 -0.125000 -0.437500
v 0.437500 -0.437500 -0.500000
v 0.062500 -0.062500 -0.500000
v 0.500000 0.187500 -0.437500
v 0.500000 0.437500 -0.437500
v 0.500000 -0.437500 -0.437500
v 0.500000 -0.437500 0.437500
v -0.437500 -0.500000 -0.437500
v -0.437500 -0.500000 0.437500
v 0.437500 -0.500000 -0.437500
v -0.500000 0.187500 0.437500
v -0.500000 0.437500 0.437500
v -0.500000 -0.437500 0.437500
v -0.500000 -0.437500 -0.437500
v 0.437500 0.187500 0.500000
v 0.437500 0.437500 0.500000
v -0.437500 0.125000 0.437500
v 0.437500 -0.437500 0.500000
v 0.437500 0.125000 -0.437500
v 0.437500 0.125000 0.437500
v -0.437500 -0.437500 0.500000
v -0.437500 -0.437500 0.437500
v 0.062500 0.187500 -0.500000
v 0.062500 0.062500 -0.500000
v -0.125000 0.187500 -0.437500
v 0.437500 0.500000 -0.437500
v 0.437500 0.187500 -0.500000
v 0.500000 0.187500 0.437500
v -0.500000 0.187500 -0.437500
v -0.437500 0.187500 0.500000
v -0.437500 -0.437500 -0.437500
v -0.062500 -0.062500 -0.437500
v -0.062500 0.187500 -0.500000
v -0.062500 -0.062500 -0.500000
v -0.437500 0.437500 0.500000
v -0.500000 0.437500 -0.437500
v 0.500000 0.437500 0.437500
v 0.437500 0.437500 -0.500000
v 0.437500 0.437500 0.437500
v -0.062500 0.187500 -0.437500
v 0.437500 0.437500 -0.437500
v 0.437500 -0.437455 0.437505
v 0.437500 0.187500 -0.437500
v 0.437500 0.187500 0.437500
v -0.437500 0.187500 0.437500
v -0.437500 0.187500 -0.437500
vn -1.0000 -0.0000 -0.0000
vn -0.0000 -0.0000 -1.0000
vn -0.0000 1.0000 -0.0000
vn -0.0000 -0.0000 1.0000
vn 1.0000 -0.0000 -0.0000
vn -0.0000 -1.0000 -0.0000
vn 0.0007 1.0000 -0.0001
vn -0.0000 1.0000 0.0007
vn -0.0000 0.0001 -1.0000
vn 0.0001 -1.0000 0.0001
vn -0.0001 -0.0000 -1.0000
vn -0.0001 1.0000 -0.0000
vt 0.625000 0.687500
vt 0.562500 0.625000
vt 0.625000 0.625000
vt 0.937500 1.000000
vt 0.062500 0.937500
vt 0.937500 0.937500
vt -0.000000 0.062500
vt -0.000000 0.937500
vt 0.937500 0.062500
vt 1.000000 0.937500
vt 0.562500 0.562500
vt 0.437500 0.500000
vt 0.562500 0.500000
vt 0.437500 0.437500
vt 0.562500 0.437500
vt 0.562500 0.750000
vt 0.562500 0.687500
vt 1.000000 1.000000
vt 0.937500 0.687500
vt 0.937500 0.625000
vt 0.062500 0.687500
vt -0.000000 1.000000
vt 0.062500 0.625000
vt 1.000000 0.687500
vt 1.000000 0.625000
vt 1.000000 0.062500
vt 0.062500 0.062500
vt 0.562500 0.375000
vt 0.375000 0.750000
vt 0.437500 0.750000
vt 1.000000 0.000000
vt 0.062500 1.000000
vt 0.062500 0.000000
vt 0.937500 0.000000
vt 0.500000 0.625000
vt 0.500000 0.687500
vt 0.437500 0.625000
vt 0.437500 0.687500
vt 0.375000 0.687500
vt 0.375000 0.625000
vt -0.000000 0.687500
vt 0.375000 0.437500
vt 0.375000 0.500000
vt 0.437500 0.375000
vt 0.500000 0.437500
vt 0.500000 0.375000
vt 0.625000 0.500000
vt 0.437500 0.562500
vt -0.000000 0.625000
vt 0.000000 0.625000
vt -0.000000 0.000000
vt 0.625000 0.437500
vt 0.625000 0.562500
vt 0.625000 0.750000
vt 0.375000 0.562500
s 0
g Chest_chest-front
usemtl chest-front
f 18/1/1 52/2/1 94/3/1
f 60/11/2 56/12/2 9/13/2
f 23/13/2 72/14/2 103/15/2
f 10/1/3 59/16/3 24/17/3
f 3/18/2 67/19/2 50/20/2
f 16/3/2 52/1/2 102/17/2
f 57/27/2 100/9/2 70/28/2
f 110/5/2 12/29/2 11/30/2
f 52/3/3 115/19/3 94/1/3
f 67/19/5 61/10/5 115/24/5
f 59/17/5 102/35/5 24/36/5
f 92/37/3 109/17/3 53/38/3
f 11/36/1 92/37/1 53/35/1
f 36/38/3 12/29/3 13/39/3
f 13/39/5 37/37/5 38/40/5
f 38/40/3 112/21/3 96/23/3
f 110/5/1 96/41/1 112/21/1
f 61/4/6 107/5/6 110/32/6
f 88/21/6 14/40/6 39/23/6
f 14/40/5 49/14/5 48/42/5
f 26/12/6 48/42/6 49/43/6
f 47/44/5 26/45/5 15/46/5
f 15/14/6 54/28/6 47/44/6
f 101/15/1 54/46/1 70/28/1
f 35/47/6 103/15/6 101/13/6
f 17/3/1 16/2/1 51/11/1
f 17/1/6 50/20/6 16/3/6
f 56/12/3 23/15/3 9/13/3
f 66/11/5 9/47/5 23/13/5
f 93/48/6 60/2/6 66/11/6
f 25/48/1 34/43/1 56/12/1
f 71/33/3 100/9/3 57/27/3
f 57/27/1 39/49/1 71/7/1
f 50/20/5 100/26/5 69/9/5
f 18/1/1 10/17/1 52/2/1
f 60/11/2 25/48/2 56/12/2
f 23/13/2 34/12/2 72/14/2
f 72/14/2 47/44/2 54/28/2
f 103/15/2 55/52/2 23/13/2
f 55/52/2 51/53/2 23/13/2
f 72/14/2 54/28/2 103/15/2
f 51/53/2 66/11/2 23/13/2
f 10/1/3 18/54/3 59/16/3
f 4/31/2 3/18/2 50/20/2
f 3/18/2 28/4/2 68/6/2
f 3/18/2 68/6/2 67/19/2
f 69/9/2 21/34/2 4/31/2
f 50/20/2 69/9/2 4/31/2
f 68/6/2 28/4/2 107/5/2
f 28/4/2 7/22/2 107/5/2
f 7/22/2 8/51/2 39/23/2
f 8/51/2 30/33/2 71/27/2
f 30/33/2 21/34/2 69/9/2
f 30/33/2 69/9/2 71/27/2
f 96/21/2 107/5/2 7/22/2
f 8/51/2 71/27/2 39/23/2
f 96/21/2 7/22/2 39/23/2
f 14/40/2 48/42/2 34/12/2
f 48/42/2 72/14/2 34/12/2
f 96/21/2 39/23/2 14/40/2
f 36/30/2 13/29/2 38/39/2
f 38/39/2 96/21/2 14/40/2
f 14/40/2 34/12/2 93/48/2
f 36/30/2 38/39/2 92/38/2
f 38/39/2 14/40/2 92/38/2
f 14/40/2 93/48/2 92/38/2
f 93/48/2 66/11/2 102/17/2
f 66/11/2 51/53/2 16/3/2
f 16/3/2 50/20/2 67/19/2
f 52/1/2 10/54/2 24/16/2
f 16/3/2 67/19/2 52/1/2
f 93/48/2 102/17/2 92/38/2
f 66/11/2 16/3/2 102/17/2
f 52/1/2 24/16/2 102/17/2
f 15/44/2 26/14/2 49/42/2
f 49/42/2 27/40/2 88/23/2
f 100/9/2 43/20/2 35/52/2
f 43/20/2 17/3/2 35/52/2
f 35/52/2 101/15/2 70/28/2
f 49/42/2 88/23/2 57/27/2
f 15/44/2 49/42/2 57/27/2
f 100/9/2 35/52/2 70/28/2
f 70/28/2 15/44/2 57/27/2
f 53/38/2 109/17/2 59/16/2
f 18/54/2 94/1/2 115/19/2
f 11/30/2 53/38/2 59/16/2
f 18/54/2 115/19/2 61/6/2
f 59/16/2 18/54/2 61/6/2
f 61/6/2 110/5/2 11/30/2
f 110/5/2 112/21/2 12/29/2
f 112/21/2 37/39/2 12/29/2
f 11/30/2 59/16/2 61/6/2
f 52/3/3 67/20/3 115/19/3
f 67/19/5 68/6/5 61/10/5
f 59/17/5 109/2/5 102/35/5
f 92/37/3 102/2/3 109/17/3
f 11/36/1 36/38/1 92/37/1
f 36/38/3 11/30/3 12/29/3
f 13/39/5 12/38/5 37/37/5
f 38/40/3 37/39/3 112/21/3
f 110/5/1 107/8/1 96/41/1
f 61/4/6 68/6/6 107/5/6
f 88/21/6 27/39/6 14/40/6
f 14/40/5 27/37/5 49/14/5
f 26/12/6 72/14/6 48/42/6
f 47/44/5 72/14/5 26/45/5
f 15/14/6 70/15/6 54/28/6
f 101/15/1 103/45/1 54/46/1
f 35/47/6 55/52/6 103/15/6
f 51/11/1 55/15/1 35/52/1
f 35/52/1 17/3/1 51/11/1
f 17/1/6 43/19/6 50/20/6
f 56/12/3 34/14/3 23/15/3
f 66/11/5 60/53/5 9/47/5
f 93/48/6 25/37/6 60/2/6
f 25/48/1 93/55/1 34/43/1
f 71/33/3 69/34/3 100/9/3
f 57/27/1 88/23/1 39/49/1
f 50/20/5 43/25/5 100/26/5
g Chest_chest-top
usemtl chest-top
f 91/4/2 58/5/2 78/6/2
f 57/7/1 58/5/1 111/8/1
f 64/6/3 65/9/3 29/10/3
f 91/6/5 77/26/5 100/9/5
f 58/5/6 79/27/6 19/7/6
f 57/27/6 91/6/6 100/9/6
f 110/27/3 62/6/3 108/5/3
f 62/6/2 63/32/2 108/5/2
f 61/26/5 64/6/5 62/10/5
f 108/5/1 95/7/1 110/27/1
f 110/33/4 65/9/4 61/34/4
f 100/9/4 79/33/4 57/27/4
f 33/26/6 77/9/6 78/6/6
f 32/32/3 64/6/3 22/4/3
f 91/4/9 111/32/9 58/5/9
f 57/7/1 79/27/1 58/5/1
f 63/5/3 32/32/3 5/22/3
f 31/7/3 7/51/3 95/27/3
f 7/51/3 28/34/3 95/27/3
f 63/5/3 5/22/3 31/7/3
f 95/27/3 63/5/3 31/7/3
f 28/34/3 3/31/3 65/9/3
f 95/27/3 28/34/3 65/9/3
f 29/10/3 1/18/3 22/4/3
f 3/31/3 29/10/3 65/9/3
f 29/10/3 22/4/3 64/6/3
f 91/6/5 78/10/5 77/26/5
f 79/27/6 30/33/6 8/51/6
f 19/7/6 6/22/6 58/5/6
f 6/22/6 20/32/6 58/5/6
f 79/27/6 8/51/6 19/7/6
f 57/27/10 111/5/10 91/6/10
f 110/27/3 61/9/3 62/6/3
f 62/6/2 64/4/2 63/32/2
f 61/26/5 65/9/5 64/6/5
f 108/5/1 63/8/1 95/7/1
f 110/33/4 95/27/4 65/9/4
f 100/9/4 77/34/4 79/33/4
f 33/26/6 4/31/6 21/34/6
f 21/34/6 30/33/6 79/27/6
f 21/34/6 79/27/6 77/9/6
f 2/18/6 33/26/6 78/6/6
f 33/26/6 21/34/6 77/9/6
f 58/5/6 20/32/6 78/6/6
f 20/32/6 2/18/6 78/6/6
f 32/32/3 63/5/3 64/6/3
g Chest_chest-side
usemtl chest-side
f 99/21/4 1/22/4 42/23/4
f 7/4/5 73/24/5 46/25/5
f 98/21/1 3/22/1 41/23/1
f 45/20/1 82/9/1 2/31/1
f 5/4/4 84/24/4 44/25/4
f 106/5/6 110/4/6 74/6/6
f 76/33/7 57/9/7 111/27/7
f 73/19/4 110/10/4 112/24/4
f 57/26/4 46/20/4 88/25/4
f 5/22/5 40/23/5 97/21/5
f 73/20/3 113/21/3 97/23/3
f 84/20/3 114/21/3 99/23/3
f 80/20/3 115/21/3 98/23/3
f 40/23/6 88/19/6 46/20/6
f 42/23/6 89/19/6 44/20/6
f 41/23/6 86/19/6 45/20/6
f 40/50/2 111/27/2 89/23/2
f 97/41/2 108/5/2 106/8/2
f 113/19/5 110/5/5 108/6/5
f 85/10/1 113/19/1 84/24/1
f 44/25/1 111/9/1 87/26/1
f 111/33/8 90/9/8 87/27/8
f 42/23/5 91/7/5 86/49/5
f 111/27/4 86/20/4 91/9/4
f 114/41/5 104/5/5 99/21/5
f 62/32/6 85/6/6 104/5/6
f 108/5/4 114/19/4 113/21/4
f 82/34/3 100/27/3 83/33/3
f 45/25/2 91/9/2 82/26/2
f 43/49/4 83/27/4 100/7/4
f 100/27/1 86/20/1 43/23/1
f 62/6/2 80/24/2 81/10/2
f 62/4/6 105/5/6 61/32/6
f 105/5/4 115/41/4 61/8/4
f 62/6/1 115/21/1 114/19/1
f 111/9/5 88/23/5 89/20/5
f 22/32/4 1/22/4 104/5/4
f 1/22/4 2/51/4 42/23/4
f 104/5/4 1/22/4 99/21/4
f 2/51/4 20/34/4 90/27/4
f 20/34/4 87/9/4 90/27/4
f 85/6/4 32/4/4 22/32/4
f 104/5/4 85/6/4 22/32/4
f 2/51/4 90/27/4 42/23/4
f 42/23/4 44/20/4 84/19/4
f 42/23/4 84/19/4 99/21/4
f 8/34/5 7/4/5 46/25/5
f 7/4/5 31/18/5 74/10/5
f 7/4/5 74/10/5 73/24/5
f 75/26/5 19/31/5 8/34/5
f 46/25/5 75/26/5 8/34/5
f 41/23/1 45/20/1 80/19/1
f 41/23/1 80/19/1 98/21/1
f 4/51/1 33/33/1 83/27/1
f 4/51/1 83/27/1 41/23/1
f 81/6/1 29/4/1 105/5/1
f 29/4/1 3/22/1 105/5/1
f 3/22/1 4/51/1 41/23/1
f 98/21/1 105/5/1 3/22/1
f 2/31/1 1/18/1 45/20/1
f 1/18/1 29/4/1 81/6/1
f 1/18/1 81/6/1 80/19/1
f 83/27/1 33/33/1 82/9/1
f 33/33/1 2/31/1 82/9/1
f 1/18/1 80/19/1 45/20/1
f 6/34/4 5/4/4 44/25/4
f 5/4/4 32/18/4 85/10/4
f 5/4/4 85/10/4 84/24/4
f 87/26/4 20/31/4 6/34/4
f 44/25/4 87/26/4 6/34/4
f 106/5/6 108/32/6 110/4/6
f 76/33/3 75/34/3 57/9/3
f 73/19/4 74/6/4 110/10/4
f 57/26/4 75/9/4 46/20/4
f 6/51/5 19/34/5 76/27/5
f 19/34/5 75/9/5 76/27/5
f 74/6/5 31/4/5 106/5/5
f 31/4/5 5/22/5 106/5/5
f 5/22/5 6/51/5 40/23/5
f 6/51/5 76/27/5 40/23/5
f 40/23/5 46/20/5 73/19/5
f 97/21/5 106/5/5 5/22/5
f 40/23/5 73/19/5 97/21/5
f 73/20/3 112/19/3 113/21/3
f 84/20/3 113/19/3 114/21/3
f 80/20/3 114/19/3 115/21/3
f 40/23/6 89/21/6 88/19/6
f 42/23/6 86/21/6 89/19/6
f 41/23/6 43/21/6 86/19/6
f 40/50/11 76/7/11 111/27/11
f 97/41/2 113/21/2 108/5/2
f 113/19/5 112/21/5 110/5/5
f 85/10/1 108/6/1 113/19/1
f 44/25/1 89/20/1 111/9/1
f 111/33/12 91/34/12 90/9/12
f 42/23/5 90/27/5 91/7/5
f 111/27/4 89/23/4 86/20/4
f 114/41/5 62/8/5 104/5/5
f 62/32/6 108/4/6 85/6/6
f 108/5/4 62/6/4 114/19/4
f 82/34/3 91/9/3 100/27/3
f 45/25/2 86/20/2 91/9/2
f 43/49/4 41/23/4 83/27/4
f 100/27/1 91/9/1 86/20/1
f 62/6/2 114/19/2 80/24/2
f 62/4/6 81/6/6 105/5/6
f 105/5/4 98/21/4 115/41/4
f 62/6/1 61/5/1 115/21/1
f 111/9/5 57/27/5 88/23/5
@@ -0,0 +1,608 @@
# Blender 4.4.3
# www.blender.org
mtllib everness_chest_opened.mtl
o Chest
v -0.500000 -0.500000 0.500000
v -0.500000 -0.500000 -0.500000
v 0.500000 -0.500000 0.500000
v 0.500000 -0.500000 -0.500000
v -0.062500 0.000000 -0.437500
v 0.125000 0.125000 -0.500000
v 0.062500 -0.125000 -0.437500
v -0.125000 0.125000 -0.500000
v -0.125000 0.125000 -0.437500
v 0.437500 -0.500000 0.500000
v -0.062500 0.000000 -0.500000
v 0.062500 0.062500 -0.437500
v 0.062500 -0.062500 -0.437500
v 0.125000 0.125000 -0.437500
v 0.437500 -0.500000 -0.500000
v 0.062500 0.000000 -0.500000
v -0.125000 -0.062500 -0.437500
v 0.437500 0.125000 -0.500000
v 0.500000 0.125000 0.437500
v -0.500000 0.125000 -0.437500
v -0.437500 0.125000 -0.437500
v 0.437500 0.125000 0.500000
v -0.500000 0.125000 0.437500
v 0.500000 0.125000 -0.437500
v 0.062500 -0.125000 -0.500000
v 0.125000 -0.062500 -0.500000
v 0.125000 -0.062500 -0.437500
v -0.437500 0.125000 -0.500000
v -0.125000 0.062500 -0.500000
v -0.062500 -0.125000 -0.500000
v -0.125000 -0.062500 -0.500000
v 0.062500 0.000000 -0.437500
v 0.437500 -0.437500 -0.437500
v 0.437500 -0.500000 0.437500
v -0.062500 0.062500 -0.437500
v -0.062500 0.062500 -0.500000
v -0.437500 -0.437500 -0.500000
v -0.062500 -0.125000 -0.437500
v 0.437500 -0.437500 -0.500000
v 0.062500 -0.062500 -0.500000
v 0.500000 -0.437500 -0.437500
v 0.500000 -0.437500 0.437500
v -0.437500 -0.500000 -0.437500
v -0.437500 -0.500000 0.437500
v 0.437500 -0.500000 -0.437500
v -0.500000 -0.437500 0.437500
v -0.500000 -0.437500 -0.437500
v -0.437500 0.125000 0.437500
v 0.437500 -0.437500 0.500000
v 0.437500 0.125000 -0.437500
v 0.437500 0.125000 0.437500
v -0.437500 -0.437500 0.500000
v -0.437500 -0.437500 0.437500
v 0.062500 0.062500 -0.500000
v -0.437500 -0.437500 -0.437500
v -0.062500 -0.062500 -0.437500
v -0.062500 -0.062500 -0.500000
v 0.437500 -0.437455 0.437505
v -0.500000 0.125000 -0.500000
v 0.500000 0.125000 -0.500000
v -0.500000 0.125000 0.500000
v -0.500000 0.390165 0.765165
v -0.500000 1.097272 0.058058
v 0.500000 0.390165 0.765165
v 0.500000 1.097272 0.058058
v -0.125000 0.920495 -0.118718
v 0.062500 0.876301 -0.074524
v 0.125000 0.876301 -0.074524
v 0.125000 0.920495 -0.118719
v -0.374993 0.787913 -0.162913
v -0.125000 0.876301 -0.074524
v -0.437500 0.390165 0.765165
v -0.062500 0.920495 -0.118718
v -0.437500 1.097272 0.058058
v -0.500000 0.434359 0.720971
v 0.500000 1.053078 0.102252
v 0.437500 0.390165 0.765165
v 0.062500 0.920495 -0.118719
v 0.125000 0.832107 -0.118719
v 0.125000 0.876301 -0.162913
v -0.437500 0.125000 0.500000
v -0.437500 0.787913 -0.162913
v -0.500000 0.169194 0.455806
v 0.500000 0.787913 -0.162913
v -0.437500 0.832107 -0.207107
v -0.125000 0.876301 -0.162913
v 0.062500 0.832107 -0.118719
v -0.062500 0.876301 -0.074524
v -0.437500 1.008884 0.058058
v -0.437500 0.390165 0.676777
v 0.437500 0.434359 0.720971
v -0.437500 0.434359 0.720971
v -0.437500 1.053078 0.102253
v -0.437500 0.876301 -0.162912
v -0.437500 1.053078 0.013864
v 0.500000 0.832107 -0.118719
v 0.500000 1.008883 0.058058
v -0.500000 0.213388 0.500000
v -0.500000 0.390165 0.676777
v 0.437500 0.169194 0.544194
v 0.437500 0.345971 0.720971
v -0.437500 0.169194 0.455806
v 0.437500 0.787913 -0.162913
v 0.437500 0.169194 0.455806
v 0.062500 0.876301 -0.162913
v -0.125000 0.832107 -0.118718
v 0.437500 1.053078 0.102252
v 0.437500 0.876301 -0.162913
v 0.500000 0.213388 0.500000
v -0.500000 0.832107 -0.118718
v -0.437500 0.169194 0.544194
v -0.062500 0.876301 -0.162913
v -0.437500 0.345971 0.720971
v -0.500000 1.008884 0.058058
v 0.500000 0.390165 0.676776
v 0.437500 1.053078 0.013864
v 0.437500 0.390165 0.676776
v -0.062500 0.832107 -0.118718
v 0.437500 1.008883 0.058058
v 0.437500 0.832107 -0.118719
v 0.437500 0.213388 0.500000
v -0.437500 0.213388 0.500000
v -0.437500 0.832107 -0.118718
v -0.500000 0.832107 -0.207107
v 0.500000 0.832107 -0.207107
v 0.500000 0.125000 0.500000
v -0.374993 0.125000 -0.374993
v 0.374993 -0.437500 -0.374993
v -0.374993 0.125000 0.374994
v 0.374993 0.125000 -0.374993
v 0.374993 0.125000 0.374993
v -0.374993 -0.437500 0.374994
v -0.374993 -0.437500 -0.374993
v 0.374994 -0.437455 0.374998
v 0.374993 0.125000 0.437500
v -0.374993 0.125000 0.437500
v 0.374568 -0.374869 -0.374568
v -0.374568 -0.374869 0.374569
v -0.374568 -0.374869 -0.374568
v 0.374568 -0.374816 0.374573
v -0.374993 0.898590 0.031891
v -0.374993 0.363998 0.566483
v 0.374993 0.363998 0.566483
v 0.374993 0.898590 0.031891
v 0.374993 0.745849 -0.120850
v 0.374993 0.211257 0.413742
v -0.374993 0.211257 0.413743
v -0.374993 0.745849 -0.120849
v 0.374993 0.787913 -0.162913
vn -0.0000 -0.0000 -1.0000
vn -1.0000 -0.0000 -0.0000
vn 1.0000 -0.0000 -0.0000
vn -0.0000 -1.0000 -0.0000
vn -0.0000 -0.0000 1.0000
vn -0.0000 1.0000 -0.0000
vn 0.0007 1.0000 -0.0001
vn -0.0000 1.0000 0.0007
vn -0.0000 -0.7071 -0.7071
vn -0.0000 0.7071 0.7071
vn -0.0000 0.7071 -0.7071
vn -0.0000 -0.7071 0.7071
vn -0.0001 1.0000 -0.0001
vn -0.0000 0.0001 -1.0000
vn 0.0001 -1.0000 0.0001
vn -0.0001 -0.0000 -1.0000
vn -0.0001 1.0000 -0.0000
vt 0.937500 1.000000
vt 0.062500 0.937500
vt 0.937500 0.937500
vt -0.000000 0.062500
vt -0.000000 0.937500
vt 0.562500 0.500000
vt 0.437500 0.562500
vt 0.437500 0.500000
vt 0.437500 0.437500
vt 0.562500 0.437500
vt 0.937500 0.062500
vt 1.000000 0.937500
vt 1.000000 0.062500
vt 0.062500 0.062500
vt 0.562500 0.375000
vt 0.000000 1.000000
vt 0.062500 1.000000
vt 0.937500 0.000000
vt 0.062500 0.000000
vt 0.375000 0.437500
vt 0.437500 0.625000
vt 0.375000 0.500000
vt 0.437500 0.375000
vt 0.500000 0.437500
vt 0.500000 0.375000
vt 0.625000 0.500000
vt 0.625000 0.625000
vt 0.562500 0.625000
vt 0.562500 0.562500
vt 0.375000 0.562500
vt 0.062500 0.625000
vt -0.000000 0.625000
vt 1.000000 0.625000
vt 0.937500 0.625000
vt 0.000000 0.625000
vt 0.875000 0.625000
vt 1.000000 1.000000
vt -0.000000 0.000000
vt 1.000000 0.000000
vt 0.375000 0.625000
vt -0.000000 0.000000
vt 0.062500 0.000000
vt 0.062500 0.062500
vt 0.625000 0.687500
vt 0.562500 0.687500
vt 0.625000 0.750000
vt 0.562500 0.750000
vt 0.937500 0.687500
vt 0.062500 0.687500
vt 1.000000 0.687500
vt 0.437500 0.687500
vt 0.375000 0.687500
vt 0.375000 0.750000
vt 0.500000 0.687500
vt 0.500000 0.625000
vt -0.000000 0.687500
vt -0.000000 0.562500
vt 0.062500 0.562500
vt 0.937500 0.562500
vt 0.875000 0.125000
vt 0.125000 0.062500
vt 0.125000 0.937500
vt 0.625000 0.437500
vt 0.625000 0.562500
vt 0.125000 0.625000
vt 1.000000 -0.000000
vt 0.062500 1.000000
vt 0.000000 1.000000
vt 0.437500 0.750000
vt 0.875000 0.937500
vt 0.125000 1.000000
vt 0.875000 1.000000
vt 1.000000 0.562500
vt 0.875000 0.875000
vt 0.062500 0.875000
vt 0.125000 0.875000
vt 0.125000 0.125000
vt 0.062500 0.125000
vt 0.937500 0.375000
s 0
g Chest_chest-front
usemtl chest-front
f 5/6/1 12/7/1 32/8/1
f 11/6/1 40/9/1 57/10/1
f 33/14/1 55/11/1 38/15/1
f 26/20/3 14/21/3 27/9/3
f 13/8/4 26/20/4 27/22/4
f 25/23/3 13/24/3 7/25/3
f 25/23/4 38/10/4 30/15/4
f 38/15/2 57/24/2 30/25/2
f 17/26/4 57/10/4 56/6/4
f 9/27/2 8/28/2 29/29/2
f 5/6/6 16/9/6 11/10/6
f 36/29/3 5/26/3 11/6/3
f 54/7/4 35/28/4 36/29/4
f 32/8/2 54/30/2 16/22/2
f 33/14/6 37/18/6 55/11/6
f 39/4/2 50/31/2 18/32/2
f 37/11/3 21/33/3 55/13/3
f 6/40/1 54/7/1 36/29/1
f 126/41/9 22/42/9 104/43/9
f 71/44/2 86/28/2 106/27/2
f 73/45/10 71/46/10 88/47/10
f 94/48/11 85/34/11 124/33/11
f 125/35/11 105/51/11 80/52/11
f 119/2/11 120/49/11 68/53/11
f 106/44/10 94/34/10 123/48/10
f 94/48/3 89/12/3 123/50/3
f 73/54/3 118/28/3 112/55/3
f 105/21/10 118/45/10 87/51/10
f 67/54/2 105/21/2 87/55/2
f 78/51/10 68/53/10 69/52/10
f 69/52/3 79/21/3 80/40/3
f 80/40/10 120/49/10 108/31/10
f 119/2/2 108/56/2 120/49/2
f 89/1/9 116/2/9 119/17/9
f 83/13/9 82/3/9 102/11/9
f 37/11/1 39/14/1 15/19/1
f 48/1/6 23/37/6 81/3/6
f 50/57/6 60/31/6 18/58/6
f 28/33/6 20/59/6 21/34/6
f 123/38/3 102/38/3 82/38/3
f 118/38/12 106/38/12 70/38/12
f 104/38/2 120/38/2 103/38/2
f 121/38/11 102/38/11 122/38/11
f 127/34/5 128/14/5 130/31/5
f 145/49/12 141/3/12 148/48/12
f 14/40/6 8/44/6 9/27/6
f 5/6/1 35/29/1 12/7/1
f 11/6/1 16/8/1 40/9/1
f 40/9/1 25/23/1 30/15/1
f 57/10/1 31/63/1 11/6/1
f 31/63/1 29/64/1 11/6/1
f 40/9/1 30/15/1 57/10/1
f 29/64/1 36/29/1 11/6/1
f 7/23/1 13/9/1 27/20/1
f 27/20/1 14/40/1 50/31/1
f 55/11/1 21/34/1 17/63/1
f 21/34/1 9/27/1 17/63/1
f 17/63/1 56/10/1 38/15/1
f 27/20/1 50/31/1 33/14/1
f 7/23/1 27/20/1 33/14/1
f 55/11/1 17/63/1 38/15/1
f 38/15/1 7/23/1 33/14/1
f 26/20/3 6/40/3 14/21/3
f 13/8/4 40/9/4 26/20/4
f 25/23/3 40/9/3 13/24/3
f 25/23/4 7/9/4 38/10/4
f 38/15/2 56/10/2 57/24/2
f 17/26/4 31/63/4 57/10/4
f 29/29/2 31/10/2 17/63/2
f 17/63/2 9/27/2 29/29/2
f 5/6/6 32/8/6 16/9/6
f 36/29/3 35/64/3 5/26/3
f 54/7/4 12/21/4 35/28/4
f 32/8/2 12/7/2 54/30/2
f 33/14/6 39/19/6 37/18/6
f 39/4/2 33/14/2 50/31/2
f 37/11/3 28/34/3 21/33/3
f 29/64/1 8/27/1 36/29/1
f 8/27/1 6/40/1 36/29/1
f 6/40/1 26/20/1 16/8/1
f 26/20/1 40/9/1 16/8/1
f 6/40/1 16/8/1 54/7/1
f 103/67/9 84/68/9 104/43/9
f 84/68/9 126/41/9 104/43/9
f 71/44/2 66/45/2 86/28/2
f 73/45/10 66/44/10 71/46/10
f 124/33/11 63/37/11 95/3/11
f 63/37/11 74/1/11 95/3/11
f 95/3/11 94/48/11 124/33/11
f 95/3/11 74/1/11 116/2/11
f 74/1/11 65/16/11 116/2/11
f 125/35/11 85/34/11 105/51/11
f 85/34/11 94/48/11 86/44/11
f 86/44/11 66/46/11 112/45/11
f 66/46/11 73/47/11 112/45/11
f 85/34/11 86/44/11 112/45/11
f 105/51/11 85/34/11 112/45/11
f 108/49/11 116/2/11 125/35/11
f 116/2/11 65/16/11 125/35/11
f 105/51/11 78/69/11 69/53/11
f 105/51/11 69/53/11 80/52/11
f 80/52/11 108/49/11 125/35/11
f 87/51/11 118/45/11 88/47/11
f 71/46/11 106/44/11 123/48/11
f 67/69/11 87/51/11 88/47/11
f 71/46/11 123/48/11 89/3/11
f 67/69/11 88/47/11 89/3/11
f 88/47/11 71/46/11 89/3/11
f 120/49/11 79/52/11 68/53/11
f 68/53/11 67/69/11 119/2/11
f 119/2/11 67/69/11 89/3/11
f 106/44/10 86/27/10 94/34/10
f 94/48/3 95/3/3 89/12/3
f 73/54/3 88/45/3 118/28/3
f 105/21/10 112/28/10 118/45/10
f 67/54/2 78/51/2 105/21/2
f 78/51/10 67/69/10 68/53/10
f 69/52/3 68/51/3 79/21/3
f 80/40/10 79/52/10 120/49/10
f 119/2/2 116/5/2 108/56/2
f 89/1/9 95/3/9 116/2/9
f 84/5/9 103/2/9 125/16/9
f 103/2/9 149/62/9 125/16/9
f 83/13/9 124/37/9 82/3/9
f 124/37/9 85/1/9 82/3/9
f 85/1/9 125/16/9 149/62/9
f 85/1/9 149/62/9 70/70/9
f 61/66/9 83/13/9 102/11/9
f 22/19/9 81/18/9 102/11/9
f 81/18/9 61/66/9 102/11/9
f 102/11/9 104/14/9 22/19/9
f 85/1/9 70/70/9 82/3/9
f 39/14/1 18/31/1 60/35/1
f 60/35/1 4/38/1 39/14/1
f 4/38/1 15/19/1 39/14/1
f 2/39/1 59/33/1 37/11/1
f 59/33/1 28/34/1 37/11/1
f 2/39/1 37/11/1 15/19/1
f 22/2/6 126/5/6 51/17/6
f 126/5/6 19/16/6 51/17/6
f 51/17/6 135/71/6 22/2/6
f 135/71/6 136/72/6 22/2/6
f 23/37/6 61/12/6 81/3/6
f 81/3/6 22/2/6 136/72/6
f 136/72/6 48/1/6 81/3/6
f 50/57/6 24/32/6 60/31/6
f 28/33/6 59/73/6 20/59/6
f 123/38/3 122/38/3 102/38/3
f 79/38/12 68/38/12 67/38/12
f 79/38/12 67/38/12 87/38/12
f 103/38/12 120/38/12 149/38/12
f 120/38/12 79/38/12 149/38/12
f 79/38/12 87/38/12 149/38/12
f 87/38/12 118/38/12 149/38/12
f 118/38/12 88/38/12 106/38/12
f 88/38/12 71/38/12 106/38/12
f 106/38/12 123/38/12 70/38/12
f 123/38/12 82/38/12 70/38/12
f 70/38/12 149/38/12 118/38/12
f 104/38/2 121/38/2 120/38/2
f 121/38/11 104/38/11 102/38/11
f 127/34/5 133/11/5 128/14/5
f 145/49/12 144/2/12 141/3/12
f 14/40/6 6/52/6 8/44/6
g Chest_chest-top
usemtl chest-top
f 53/1/1 34/2/1 44/3/1
f 33/4/2 34/2/2 58/5/2
f 55/11/3 44/12/3 43/13/3
f 3/16/4 10/17/4 34/2/4
f 33/14/4 53/3/4 55/11/4
f 33/14/5 43/18/5 45/19/5
f 43/11/4 44/3/4 1/37/4
f 93/11/10 107/14/10 74/18/10
f 119/14/10 90/3/10 117/2/10
f 117/2/11 92/1/11 91/17/11
f 90/12/3 93/11/3 92/3/3
f 117/2/2 107/4/2 119/14/2
f 89/18/12 107/14/12 93/11/12
f 72/1/10 91/2/10 92/3/10
f 130/60/6 51/14/6 50/11/6
f 136/2/6 131/61/6 129/62/6
f 137/14/13 138/3/13 140/2/13
f 142/3/9 144/14/9 143/2/9
f 148/62/9 149/14/9 145/61/9
f 104/11/9 102/3/9 146/60/9
f 53/1/14 58/17/14 34/2/14
f 33/4/2 45/14/2 34/2/2
f 55/11/3 53/3/3 44/12/3
f 34/2/4 45/14/4 4/38/4
f 45/14/4 15/19/4 4/38/4
f 4/38/4 3/16/4 34/2/4
f 33/14/15 58/2/15 53/3/15
f 33/14/5 55/11/5 43/18/5
f 2/39/4 15/19/4 43/11/4
f 15/19/4 45/14/4 43/11/4
f 34/2/4 10/17/4 44/3/4
f 10/17/4 1/37/4 44/3/4
f 2/39/4 43/11/4 1/37/4
f 107/14/10 91/2/10 76/4/10
f 91/2/10 77/17/10 64/16/10
f 76/4/10 91/2/10 64/16/10
f 76/4/10 65/38/10 107/14/10
f 65/38/10 74/18/10 107/14/10
f 74/18/10 63/39/10 93/11/10
f 63/39/10 75/12/10 93/11/10
f 75/12/10 62/37/10 92/3/10
f 62/37/10 72/1/10 92/3/10
f 75/12/10 92/3/10 93/11/10
f 119/14/10 89/11/10 90/3/10
f 117/2/11 90/3/11 92/1/11
f 90/12/3 89/13/3 93/11/3
f 117/2/2 91/5/2 107/4/2
f 89/18/12 119/19/12 107/14/12
f 72/1/10 77/17/10 91/2/10
f 21/3/6 48/2/6 127/74/6
f 48/2/6 136/75/6 129/76/6
f 127/74/6 48/2/6 129/76/6
f 130/60/6 131/77/6 51/14/6
f 131/77/6 135/78/6 51/14/6
f 21/3/6 127/74/6 9/34/6
f 127/74/6 130/60/6 9/34/6
f 50/11/6 14/79/6 130/60/6
f 14/79/6 9/34/6 130/60/6
f 136/2/6 135/14/6 131/61/6
f 137/14/6 139/11/6 138/3/6
f 142/3/9 141/11/9 144/14/9
f 148/62/9 70/2/9 149/14/9
f 102/3/9 82/2/9 148/76/9
f 82/2/9 70/75/9 148/76/9
f 149/78/9 103/14/9 145/77/9
f 103/14/9 104/11/9 146/60/9
f 146/60/9 145/77/9 103/14/9
f 102/3/9 148/76/9 147/74/9
f 102/3/9 147/74/9 146/60/9
g Chest_chest-side
usemtl chest-side
f 42/19/7 33/11/7 58/14/7
f 33/13/5 24/34/5 50/33/5
f 19/35/1 58/14/1 51/31/1
f 22/33/2 58/11/2 49/13/2
f 58/19/8 52/11/8 49/14/8
f 81/31/3 53/4/3 48/32/3
f 136/36/5 48/34/5 53/11/5
f 46/18/6 55/14/6 47/19/6
f 23/33/1 53/11/1 46/13/1
f 21/32/5 47/14/5 55/4/5
f 55/14/2 48/34/2 21/31/2
f 58/11/3 50/31/3 51/34/3
f 47/14/2 2/38/2 1/39/2
f 52/14/5 1/38/5 10/18/5
f 61/35/12 111/49/12 113/2/12
f 96/50/3 84/33/3 125/34/3
f 114/2/2 63/16/2 124/35/2
f 98/48/2 83/34/2 61/33/2
f 101/12/12 100/50/12 126/34/12
f 97/3/9 117/17/9 119/1/9
f 96/48/12 119/12/12 120/50/12
f 64/16/3 126/35/3 115/2/3
f 109/31/10 120/48/10 121/49/10
f 111/31/10 121/48/10 122/49/10
f 110/31/10 122/48/10 123/49/10
f 115/5/11 121/49/11 117/2/11
f 121/48/3 119/2/3 117/3/3
f 100/50/2 117/3/2 121/48/2
f 111/49/3 90/5/3 113/2/3
f 90/17/9 101/3/9 113/2/9
f 121/49/12 90/3/12 122/48/12
f 90/3/11 98/50/11 99/12/11
f 89/17/9 99/3/9 114/2/9
f 89/5/12 110/49/12 123/56/12
f 90/3/2 123/49/2 122/48/2
f 3/38/3 4/39/3 42/14/3
f 134/14/1 129/34/1 131/31/1
f 129/34/3 133/14/3 127/31/3
f 130/31/2 134/11/2 131/34/2
f 144/2/2 146/48/2 143/3/2
f 147/48/11 143/2/11 146/49/11
f 148/49/3 142/3/3 147/48/3
f 42/19/6 41/18/6 33/11/6
f 33/13/5 41/11/5 24/34/5
f 19/35/16 42/4/16 58/14/16
f 22/33/2 51/34/2 58/11/2
f 58/19/17 53/18/17 52/11/17
f 81/31/3 52/14/3 53/4/3
f 53/11/5 58/14/5 136/36/5
f 58/14/5 51/31/5 135/65/5
f 58/14/5 135/65/5 136/36/5
f 46/18/6 53/11/6 55/14/6
f 23/33/1 48/34/1 53/11/1
f 21/32/5 20/31/5 47/14/5
f 55/14/2 53/11/2 48/34/2
f 58/11/3 33/14/3 50/31/3
f 1/39/2 61/33/2 46/11/2
f 61/33/2 23/34/2 46/11/2
f 20/31/2 59/35/2 47/14/2
f 59/35/2 2/38/2 47/14/2
f 1/39/2 46/11/2 47/14/2
f 52/14/5 81/31/5 61/35/5
f 10/18/5 3/66/5 49/11/5
f 3/66/5 126/33/5 49/11/5
f 126/33/5 22/34/5 49/11/5
f 52/14/5 61/35/5 1/38/5
f 49/11/5 52/14/5 10/18/5
f 72/17/12 62/16/12 113/2/12
f 62/16/12 61/35/12 113/2/12
f 81/31/12 22/34/12 100/48/12
f 101/3/12 77/1/12 72/17/12
f 113/2/12 101/3/12 72/17/12
f 61/35/12 81/31/12 111/49/12
f 81/31/12 100/48/12 111/49/12
f 125/34/3 65/1/3 96/50/3
f 65/1/3 76/37/3 97/12/3
f 96/50/3 65/1/3 97/12/3
f 124/35/2 83/34/2 110/49/2
f 83/34/2 98/48/2 110/49/2
f 99/3/2 75/1/2 114/2/2
f 75/1/2 63/16/2 114/2/2
f 124/35/2 110/49/2 114/2/2
f 61/33/2 62/37/2 99/3/2
f 62/37/2 75/1/2 99/3/2
f 99/3/2 98/48/2 61/33/2
f 126/34/12 64/1/12 101/12/12
f 64/1/12 77/37/12 101/12/12
f 100/50/12 22/33/12 126/34/12
f 97/3/9 115/2/9 117/17/9
f 96/48/12 97/3/12 119/12/12
f 126/35/3 84/34/3 109/49/3
f 84/34/3 96/48/3 109/49/3
f 97/3/3 76/1/3 115/2/3
f 76/1/3 64/16/3 115/2/3
f 126/35/3 109/49/3 115/2/3
f 109/31/10 96/34/10 120/48/10
f 111/31/10 100/34/10 121/48/10
f 110/31/10 98/34/10 122/48/10
f 115/5/11 109/56/11 121/49/11
f 121/48/3 120/49/3 119/2/3
f 100/50/2 101/12/2 117/3/2
f 111/49/3 122/56/3 90/5/3
f 90/17/9 117/1/9 101/3/9
f 121/49/12 117/2/12 90/3/12
f 90/3/11 122/48/11 98/50/11
f 89/17/9 90/1/9 99/3/9
f 89/5/12 114/2/12 110/49/12
f 90/3/2 89/2/2 123/49/2
f 42/14/3 19/31/3 126/35/3
f 4/39/3 60/33/3 41/11/3
f 60/33/3 24/34/3 41/11/3
f 42/14/3 126/35/3 3/38/3
f 4/39/3 41/11/3 42/14/3
f 134/14/1 132/11/1 129/34/1
f 129/34/3 132/11/3 133/14/3
f 130/31/2 128/14/2 134/11/2
f 144/2/2 145/49/2 146/48/2
f 147/48/11 142/3/11 143/2/11
f 148/49/3 141/2/3 142/3/3
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,484 @@
v -0.0625 -0.5000 -0.0625
v 0.0625 -0.5000 -0.0625
v 0.0625 1.0625 -0.0625
v -0.0625 1.0625 -0.0625
v -0.0625 -0.5000 0.0625
v 0.0625 -0.5000 0.0625
v 0.0625 1.0625 0.0625
v -0.0625 1.0625 0.0625
v -0.3125 1.2500 -0.3125
v 0.3125 1.2500 -0.3125
v 0.3125 1.5000 -0.3125
v -0.3125 1.5000 -0.3125
v -0.3125 1.2500 0.3125
v 0.3125 1.2500 0.3125
v 0.3125 1.5000 0.3125
v -0.3125 1.5000 0.3125
v -0.3125 1.0625 -0.1250
v 0.3125 1.0625 -0.1250
v 0.3125 1.2500 -0.1250
v -0.3125 1.2500 -0.1250
v -0.3125 1.0625 0.3125
v 0.3125 1.0625 0.3125
v 0.3125 1.2500 0.3125
v -0.3125 1.2500 0.3125
v -0.3125 1.0625 -0.3125
v -0.2500 1.0625 -0.3125
v -0.2500 1.2500 -0.3125
v -0.3125 1.2500 -0.3125
v -0.3125 1.0625 -0.1250
v -0.2500 1.0625 -0.1250
v -0.2500 1.2500 -0.1250
v -0.3125 1.2500 -0.1250
v -0.0625 1.0625 -0.3125
v 0.0625 1.0625 -0.3125
v 0.0625 1.2500 -0.3125
v -0.0625 1.2500 -0.3125
v -0.0625 1.0625 -0.1250
v 0.0625 1.0625 -0.1250
v 0.0625 1.2500 -0.1250
v -0.0625 1.2500 -0.1250
v 0.2500 1.0625 -0.3125
v 0.3125 1.0625 -0.3125
v 0.3125 1.2500 -0.3125
v 0.2500 1.2500 -0.3125
v 0.2500 1.0625 -0.1250
v 0.3125 1.0625 -0.1250
v 0.3125 1.2500 -0.1250
v 0.2500 1.2500 -0.1250
v -0.2500 0.9375 -0.3125
v 0.2500 0.9375 -0.3125
v 0.2500 1.0625 -0.3125
v -0.2500 1.0625 -0.3125
v -0.2500 0.9375 0.3125
v 0.2500 0.9375 0.3125
v 0.2500 1.0625 0.3125
v -0.2500 1.0625 0.3125
v -0.2500 0.8125 -0.3125
v -0.1875 0.8125 -0.3125
v -0.1875 0.9375 -0.3125
v -0.2500 0.9375 -0.3125
v -0.2500 0.8125 0.3125
v -0.1875 0.8125 0.3125
v -0.1875 0.9375 0.3125
v -0.2500 0.9375 0.3125
v -0.1250 0.8125 -0.3125
v -0.0625 0.8125 -0.3125
v -0.0625 0.9375 -0.3125
v -0.1250 0.9375 -0.3125
v -0.1250 0.8125 0.3125
v -0.0625 0.8125 0.3125
v -0.0625 0.9375 0.3125
v -0.1250 0.9375 0.3125
v 0.0625 0.8125 -0.3125
v 0.1250 0.8125 -0.3125
v 0.1250 0.9375 -0.3125
v 0.0625 0.9375 -0.3125
v 0.0625 0.8125 0.3125
v 0.1250 0.8125 0.3125
v 0.1250 0.9375 0.3125
v 0.0625 0.9375 0.3125
v 0.1875 0.8125 -0.3125
v 0.2500 0.8125 -0.3125
v 0.2500 0.9375 -0.3125
v 0.1875 0.9375 -0.3125
v 0.1875 0.8125 0.3125
v 0.2500 0.8125 0.3125
v 0.2500 0.9375 0.3125
v 0.1875 0.9375 0.3125
vt 0.0000 0.7109
vt 0.0156 0.7109
vt 0.0156 0.9062
vt 0.0000 0.9062
vt 0.0000 0.7109
vt 0.0156 0.7109
vt 0.0156 0.9062
vt 0.0000 0.9062
vt 0.0000 0.7109
vt 0.0156 0.7109
vt 0.0156 0.9062
vt 0.0000 0.9062
vt 0.0000 0.7109
vt 0.0156 0.7109
vt 0.0156 0.9062
vt 0.0000 0.9062
vt 0.0000 0.7109
vt 0.0156 0.7109
vt 0.0156 0.9062
vt 0.0000 0.9062
vt 0.0000 0.7109
vt 0.0156 0.7109
vt 0.0156 0.9062
vt 0.0000 0.9062
vt 0.0000 0.9688
vt 0.0781 0.9688
vt 0.0781 1.0000
vt 0.0000 1.0000
vt 0.0938 0.9688
vt 0.1719 0.9688
vt 0.1719 1.0000
vt 0.0938 1.0000
vt 0.1797 0.9688
vt 0.2578 0.9688
vt 0.2578 1.0000
vt 0.1797 1.0000
vt 0.2656 0.9688
vt 0.3438 0.9688
vt 0.3438 1.0000
vt 0.2656 1.0000
vt 0.3516 0.9219
vt 0.4297 0.9219
vt 0.4297 1.0000
vt 0.3516 1.0000
vt 0.4375 0.9219
vt 0.5156 0.9219
vt 0.5156 1.0000
vt 0.4375 1.0000
vt 0.0000 0.6719
vt 0.0312 0.6719
vt 0.0312 0.7031
vt 0.0000 0.7031
vt 0.5234 0.9766
vt 0.6016 0.9766
vt 0.6016 1.0000
vt 0.5234 1.0000
vt 0.6094 0.9766
vt 0.6641 0.9766
vt 0.6641 1.0000
vt 0.6094 1.0000
vt 0.6719 0.9766
vt 0.7266 0.9766
vt 0.7266 1.0000
vt 0.6719 1.0000
vt 0.7344 0.9453
vt 0.8125 0.9453
vt 0.8125 1.0000
vt 0.7344 1.0000
vt 0.8203 0.9453
vt 0.8984 0.9453
vt 0.8984 1.0000
vt 0.8203 1.0000
vt 0.0000 0.9453
vt 0.0078 0.9453
vt 0.0078 0.9688
vt 0.0000 0.9688
vt 0.9062 0.9766
vt 0.9141 0.9766
vt 0.9141 1.0000
vt 0.9062 1.0000
vt 0.9219 0.9766
vt 0.9453 0.9766
vt 0.9453 1.0000
vt 0.9219 1.0000
vt 0.9531 0.9766
vt 0.9766 0.9766
vt 0.9766 1.0000
vt 0.9531 1.0000
vt 0.9844 0.9766
vt 0.9922 0.9766
vt 0.9922 1.0000
vt 0.9844 1.0000
vt 0.0938 0.8906
vt 0.1016 0.8906
vt 0.1016 0.9141
vt 0.0938 0.9141
vt 0.0312 0.9453
vt 0.0469 0.9453
vt 0.0469 0.9688
vt 0.0312 0.9688
vt 0.1094 0.8906
vt 0.1250 0.8906
vt 0.1250 0.9141
vt 0.1094 0.9141
vt 0.1328 0.8906
vt 0.1562 0.8906
vt 0.1562 0.9141
vt 0.1328 0.9141
vt 0.1641 0.8906
vt 0.1875 0.8906
vt 0.1875 0.9141
vt 0.1641 0.9141
vt 0.1953 0.8906
vt 0.2109 0.8906
vt 0.2109 0.9141
vt 0.1953 0.9141
vt 0.2188 0.8906
vt 0.2344 0.8906
vt 0.2344 0.9141
vt 0.2188 0.9141
vt 0.0703 0.9453
vt 0.0781 0.9453
vt 0.0781 0.9688
vt 0.0703 0.9688
vt 0.2422 0.8906
vt 0.2500 0.8906
vt 0.2500 0.9141
vt 0.2422 0.9141
vt 0.2578 0.8906
vt 0.2812 0.8906
vt 0.2812 0.9141
vt 0.2578 0.9141
vt 0.2891 0.8906
vt 0.3125 0.8906
vt 0.3125 0.9141
vt 0.2891 0.9141
vt 0.3203 0.8906
vt 0.3281 0.8906
vt 0.3281 0.9141
vt 0.3203 0.9141
vt 0.3359 0.8906
vt 0.3438 0.8906
vt 0.3438 0.9141
vt 0.3359 0.9141
vt 0.0078 0.9297
vt 0.0703 0.9297
vt 0.0703 0.9453
vt 0.0078 0.9453
vt 0.3516 0.8984
vt 0.4141 0.8984
vt 0.4141 0.9141
vt 0.3516 0.9141
vt 0.4219 0.8984
vt 0.5000 0.8984
vt 0.5000 0.9141
vt 0.4219 0.9141
vt 0.5078 0.8984
vt 0.5859 0.8984
vt 0.5859 0.9141
vt 0.5078 0.9141
vt 0.5938 0.8359
vt 0.6562 0.8359
vt 0.6562 0.9141
vt 0.5938 0.9141
vt 0.6641 0.8359
vt 0.7266 0.8359
vt 0.7266 0.9141
vt 0.6641 0.9141
vt 0.0078 0.9141
vt 0.0156 0.9141
vt 0.0156 0.9297
vt 0.0078 0.9297
vt 0.7344 0.8984
vt 0.7422 0.8984
vt 0.7422 0.9141
vt 0.7344 0.9141
vt 0.7500 0.8984
vt 0.8281 0.8984
vt 0.8281 0.9141
vt 0.7500 0.9141
vt 0.8359 0.8984
vt 0.9141 0.8984
vt 0.9141 0.9141
vt 0.8359 0.9141
vt 0.9219 0.8359
vt 0.9297 0.8359
vt 0.9297 0.9141
vt 0.9219 0.9141
vt 0.9375 0.8359
vt 0.9453 0.8359
vt 0.9453 0.9141
vt 0.9375 0.9141
vt 0.0234 0.9141
vt 0.0312 0.9141
vt 0.0312 0.9297
vt 0.0234 0.9297
vt 0.9531 0.8984
vt 0.9609 0.8984
vt 0.9609 0.9141
vt 0.9531 0.9141
vt 0.0938 0.8125
vt 0.1719 0.8125
vt 0.1719 0.8281
vt 0.0938 0.8281
vt 0.1797 0.8125
vt 0.2578 0.8125
vt 0.2578 0.8281
vt 0.1797 0.8281
vt 0.2656 0.7500
vt 0.2734 0.7500
vt 0.2734 0.8281
vt 0.2656 0.8281
vt 0.2812 0.7500
vt 0.2891 0.7500
vt 0.2891 0.8281
vt 0.2812 0.8281
vt 0.0469 0.9141
vt 0.0547 0.9141
vt 0.0547 0.9297
vt 0.0469 0.9297
vt 0.2969 0.8125
vt 0.3047 0.8125
vt 0.3047 0.8281
vt 0.2969 0.8281
vt 0.3125 0.8125
vt 0.3906 0.8125
vt 0.3906 0.8281
vt 0.3125 0.8281
vt 0.3984 0.8125
vt 0.4766 0.8125
vt 0.4766 0.8281
vt 0.3984 0.8281
vt 0.4844 0.7500
vt 0.4922 0.7500
vt 0.4922 0.8281
vt 0.4844 0.8281
vt 0.5000 0.7500
vt 0.5078 0.7500
vt 0.5078 0.8281
vt 0.5000 0.8281
vt 0.0625 0.9141
vt 0.0703 0.9141
vt 0.0703 0.9297
vt 0.0625 0.9297
vt 0.5156 0.8125
vt 0.5234 0.8125
vt 0.5234 0.8281
vt 0.5156 0.8281
vt 0.5312 0.8125
vt 0.6094 0.8125
vt 0.6094 0.8281
vt 0.5312 0.8281
vt 0.6172 0.8125
vt 0.6953 0.8125
vt 0.6953 0.8281
vt 0.6172 0.8281
vt 0.7031 0.7500
vt 0.7109 0.7500
vt 0.7109 0.8281
vt 0.7031 0.8281
vt 0.7188 0.7500
vt 0.7266 0.7500
vt 0.7266 0.8281
vt 0.7188 0.8281
vn 0.0000 0.0000 -1.0000
vn 0.0000 0.0000 1.0000
vn -1.0000 0.0000 0.0000
vn 1.0000 0.0000 0.0000
vn 0.0000 1.0000 0.0000
vn 0.0000 -1.0000 0.0000
vn 0.0000 0.0000 -1.0000
vn 0.0000 0.0000 1.0000
vn -1.0000 0.0000 0.0000
vn 1.0000 0.0000 0.0000
vn 0.0000 1.0000 0.0000
vn 0.0000 -1.0000 0.0000
vn 0.0000 0.0000 -1.0000
vn 0.0000 0.0000 1.0000
vn -1.0000 0.0000 0.0000
vn 1.0000 0.0000 0.0000
vn 0.0000 1.0000 0.0000
vn 0.0000 -1.0000 0.0000
vn 0.0000 0.0000 -1.0000
vn 0.0000 0.0000 1.0000
vn -1.0000 0.0000 0.0000
vn 1.0000 0.0000 0.0000
vn 0.0000 1.0000 0.0000
vn 0.0000 -1.0000 0.0000
vn 0.0000 0.0000 -1.0000
vn 0.0000 0.0000 1.0000
vn -1.0000 0.0000 0.0000
vn 1.0000 0.0000 0.0000
vn 0.0000 1.0000 0.0000
vn 0.0000 -1.0000 0.0000
vn 0.0000 0.0000 -1.0000
vn 0.0000 0.0000 1.0000
vn -1.0000 0.0000 0.0000
vn 1.0000 0.0000 0.0000
vn 0.0000 1.0000 0.0000
vn 0.0000 -1.0000 0.0000
vn 0.0000 0.0000 -1.0000
vn 0.0000 0.0000 1.0000
vn -1.0000 0.0000 0.0000
vn 1.0000 0.0000 0.0000
vn 0.0000 1.0000 0.0000
vn 0.0000 -1.0000 0.0000
vn 0.0000 0.0000 -1.0000
vn 0.0000 0.0000 1.0000
vn -1.0000 0.0000 0.0000
vn 1.0000 0.0000 0.0000
vn 0.0000 1.0000 0.0000
vn 0.0000 -1.0000 0.0000
vn 0.0000 0.0000 -1.0000
vn 0.0000 0.0000 1.0000
vn -1.0000 0.0000 0.0000
vn 1.0000 0.0000 0.0000
vn 0.0000 1.0000 0.0000
vn 0.0000 -1.0000 0.0000
vn 0.0000 0.0000 -1.0000
vn 0.0000 0.0000 1.0000
vn -1.0000 0.0000 0.0000
vn 1.0000 0.0000 0.0000
vn 0.0000 1.0000 0.0000
vn 0.0000 -1.0000 0.0000
vn 0.0000 0.0000 -1.0000
vn 0.0000 0.0000 1.0000
vn -1.0000 0.0000 0.0000
vn 1.0000 0.0000 0.0000
vn 0.0000 1.0000 0.0000
vn 0.0000 -1.0000 0.0000
f 1/1/1 2/2/1 3/3/1 4/4/1
f 6/5/2 5/6/2 8/7/2 7/8/2
f 5/9/3 1/10/3 4/11/3 8/12/3
f 2/13/4 6/14/4 7/15/4 3/16/4
f 4/17/5 3/18/5 7/19/5 8/20/5
f 5/21/6 6/22/6 2/23/6 1/24/6
f 9/25/7 10/26/7 11/27/7 12/28/7
f 14/29/8 13/30/8 16/31/8 15/32/8
f 13/33/9 9/34/9 12/35/9 16/36/9
f 10/37/10 14/38/10 15/39/10 11/40/10
f 12/41/11 11/42/11 15/43/11 16/44/11
f 13/45/12 14/46/12 10/47/12 9/48/12
f 17/49/13 18/50/13 19/51/13 20/52/13
f 22/53/14 21/54/14 24/55/14 23/56/14
f 21/57/15 17/58/15 20/59/15 24/60/15
f 18/61/16 22/62/16 23/63/16 19/64/16
f 20/65/17 19/66/17 23/67/17 24/68/17
f 21/69/18 22/70/18 18/71/18 17/72/18
f 25/73/19 26/74/19 27/75/19 28/76/19
f 30/77/20 29/78/20 32/79/20 31/80/20
f 29/81/21 25/82/21 28/83/21 32/84/21
f 26/85/22 30/86/22 31/87/22 27/88/22
f 28/89/23 27/90/23 31/91/23 32/92/23
f 29/93/24 30/94/24 26/95/24 25/96/24
f 33/97/25 34/98/25 35/99/25 36/100/25
f 38/101/26 37/102/26 40/103/26 39/104/26
f 37/105/27 33/106/27 36/107/27 40/108/27
f 34/109/28 38/110/28 39/111/28 35/112/28
f 36/113/29 35/114/29 39/115/29 40/116/29
f 37/117/30 38/118/30 34/119/30 33/120/30
f 41/121/31 42/122/31 43/123/31 44/124/31
f 46/125/32 45/126/32 48/127/32 47/128/32
f 45/129/33 41/130/33 44/131/33 48/132/33
f 42/133/34 46/134/34 47/135/34 43/136/34
f 44/137/35 43/138/35 47/139/35 48/140/35
f 45/141/36 46/142/36 42/143/36 41/144/36
f 49/145/37 50/146/37 51/147/37 52/148/37
f 54/149/38 53/150/38 56/151/38 55/152/38
f 53/153/39 49/154/39 52/155/39 56/156/39
f 50/157/40 54/158/40 55/159/40 51/160/40
f 52/161/41 51/162/41 55/163/41 56/164/41
f 53/165/42 54/166/42 50/167/42 49/168/42
f 57/169/43 58/170/43 59/171/43 60/172/43
f 62/173/44 61/174/44 64/175/44 63/176/44
f 61/177/45 57/178/45 60/179/45 64/180/45
f 58/181/46 62/182/46 63/183/46 59/184/46
f 60/185/47 59/186/47 63/187/47 64/188/47
f 61/189/48 62/190/48 58/191/48 57/192/48
f 65/193/49 66/194/49 67/195/49 68/196/49
f 70/197/50 69/198/50 72/199/50 71/200/50
f 69/201/51 65/202/51 68/203/51 72/204/51
f 66/205/52 70/206/52 71/207/52 67/208/52
f 68/209/53 67/210/53 71/211/53 72/212/53
f 69/213/54 70/214/54 66/215/54 65/216/54
f 73/217/55 74/218/55 75/219/55 76/220/55
f 78/221/56 77/222/56 80/223/56 79/224/56
f 77/225/57 73/226/57 76/227/57 80/228/57
f 74/229/58 78/230/58 79/231/58 75/232/58
f 76/233/59 75/234/59 79/235/59 80/236/59
f 77/237/60 78/238/60 74/239/60 73/240/60
f 81/241/61 82/242/61 83/243/61 84/244/61
f 86/245/62 85/246/62 88/247/62 87/248/62
f 85/249/63 81/250/63 84/251/63 88/252/63
f 82/253/64 86/254/64 87/255/64 83/256/64
f 84/257/65 83/258/65 87/259/65 88/260/65
f 85/261/66 86/262/66 82/263/66 81/264/66
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,62 @@
# Blender v2.83.20 OBJ File: 'everness_mesh_bush.blend'
# www.blender.org
mtllib everness_forsythia_mesh.mtl
o Cube
v 0.500000 0.500000 -0.500000
v 0.500000 -0.500000 -0.500000
v 0.500000 0.500000 0.500000
v 0.500000 -0.500000 0.500000
v -0.500000 0.500000 -0.500000
v -0.500000 -0.500000 -0.500000
v -0.500000 0.500000 0.500000
v -0.500000 -0.500000 0.500000
v 0.353553 0.500000 -0.353553
v 0.353553 -0.500000 -0.353553
v -0.353553 0.500000 0.353553
v -0.353553 -0.500000 0.353553
v -0.353553 0.500000 -0.353553
v -0.353553 -0.500000 -0.353553
v 0.353553 0.500000 0.353553
v 0.353553 -0.500000 0.353553
vt 0.333333 1.000000
vt 0.000000 1.000000
vt 0.000000 0.500000
vt 0.333333 0.500000
vt 0.666667 0.500000
vt 0.666667 1.000000
vt 0.333333 1.000000
vt 0.333333 0.500000
vt 0.666667 0.000000
vt 0.666667 0.500000
vt 0.333333 0.500000
vt 0.333333 0.000000
vt 1.000000 0.500000
vt 1.000000 1.000000
vt 0.312500 0.000000
vt 0.312500 0.500000
vt -0.000000 0.500000
vt -0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 0.500000
vt 0.666667 0.500000
vt 0.666667 0.000000
vt 1.000000 0.000000
vt 1.000000 0.500000
vt 0.666667 0.500000
vt 0.666667 0.000000
vn 0.0000 1.0000 0.0000
vn 0.0000 0.0000 1.0000
vn -1.0000 0.0000 0.0000
vn 1.0000 0.0000 0.0000
vn 0.0000 0.0000 -1.0000
vn 0.7071 0.0000 0.7071
vn 0.7071 0.0000 -0.7071
usemtl Material
s off
f 1/1/1 5/2/1 7/3/1 3/4/1
f 4/5/2 3/6/2 7/7/2 8/8/2
f 8/9/3 7/10/3 5/11/3 6/12/3
f 2/13/4 1/14/4 3/6/4 4/5/4
f 6/15/5 5/16/5 1/17/5 2/18/5
f 10/19/6 9/20/6 11/21/6 12/22/6
f 14/23/7 13/24/7 15/25/7 16/26/7
@@ -0,0 +1,292 @@
# Blender v2.83.20 OBJ File: 'everness_glowing_pillar.blend'
# www.blender.org
mtllib everness_glowing_pillar.mtl
o Cube
v 0.625000 -0.500000 -0.625000
v -0.625000 -0.500000 0.625000
v -0.625000 -0.500000 -0.625000
v 0.625000 -0.500000 0.625000
v 0.625000 2.000000 -0.625000
v -0.625000 2.000000 0.625000
v -0.625000 2.000000 -0.625000
v 0.625000 2.000000 0.625000
v 0.625000 3.250000 -0.625000
v 0.625000 2.000000 -0.625000
v 0.625000 3.250000 0.625000
v 0.625000 2.000000 0.625000
v -0.625000 3.250000 -0.625000
v -0.625000 2.000000 -0.625000
v -0.625000 3.250000 0.625000
v -0.625000 2.000000 0.625000
v -1.250000 2.167468 0.625000
v -0.625000 3.250000 0.625000
v -1.250000 2.167468 -0.625000
v -0.625000 3.250000 -0.625000
v -0.625000 0.750000 0.625000
v -0.625000 2.000000 0.625000
v -0.625000 0.750000 -0.625000
v -0.625000 2.000000 -0.625000
v -1.250000 0.917468 0.625000
v -0.625000 2.000000 0.625000
v -1.250000 0.917468 -0.625000
v -0.625000 2.000000 -0.625000
v -1.250000 1.698712 0.625000
v -0.625000 2.781244 0.625000
v -1.250000 1.698712 -0.625000
v -0.625000 2.781244 -0.625000
v -1.250000 1.304804 0.625000
v -0.625000 2.387336 0.625000
v -1.250000 1.304804 -0.625000
v -0.625000 2.387336 -0.625000
v 1.249999 2.167468 -0.625000
v 0.624999 3.250000 -0.625000
v 1.250000 2.167468 0.625000
v 0.625000 3.250000 0.625000
v 0.624999 0.750000 -0.625000
v 0.625000 2.000000 -0.625000
v 0.625000 0.750000 0.625000
v 0.625000 2.000000 0.625000
v 1.250000 0.917468 -0.625000
v 0.625000 2.000000 -0.625000
v 1.250000 0.917468 0.625000
v 0.625000 2.000000 0.625000
v 1.249999 1.698713 -0.625000
v 0.625000 2.781244 -0.625000
v 1.250000 1.698712 0.625000
v 0.625000 2.781244 0.625000
v 1.250000 1.304805 -0.625000
v 0.624999 2.387336 -0.625000
v 1.250000 1.304805 0.625000
v 0.625000 2.387336 0.625000
v -0.625000 2.167468 -1.250000
v -0.625000 3.250000 -0.625000
v 0.625000 2.167468 -1.250001
v 0.625000 3.250000 -0.625001
v -0.625000 0.750000 -0.625000
v -0.625000 2.000000 -0.625000
v 0.625000 0.750000 -0.625001
v 0.625000 2.000000 -0.625001
v -0.625000 0.917468 -1.250000
v -0.625000 2.000000 -0.625000
v 0.625000 0.917468 -1.250001
v 0.625000 2.000000 -0.625001
v -0.625000 1.698712 -1.250000
v -0.625000 2.781244 -0.625000
v 0.625000 1.698712 -1.250001
v 0.625000 2.781244 -0.625001
v -0.625000 1.304804 -1.250000
v -0.625000 2.387336 -0.625000
v 0.625000 1.304805 -1.250001
v 0.625000 2.387336 -0.625001
v 0.625000 2.167468 1.250000
v 0.625000 3.250000 0.625000
v -0.625000 2.167468 1.250001
v -0.625000 3.250000 0.625001
v 0.625000 0.750000 0.625000
v 0.625000 2.000000 0.625000
v -0.625000 0.750000 0.625001
v -0.625000 2.000000 0.625001
v 0.625000 0.917468 1.250000
v 0.625000 2.000000 0.625000
v -0.624999 0.917468 1.250001
v -0.625000 2.000000 0.625001
v 0.625000 1.698712 1.250000
v 0.625000 2.781244 0.625000
v -0.624999 1.698712 1.250001
v -0.625000 2.781244 0.625001
v 0.625000 1.304805 1.250000
v 0.625000 2.387336 0.625000
v -0.624999 1.304804 1.250001
v -0.625000 2.387336 0.625001
v 0.625001 3.562500 0.625000
v 0.625000 3.562500 -0.625000
v -0.624999 3.562500 0.625001
v -0.625000 3.562500 -0.624999
v 0.000001 3.250000 0.000000
v -0.624269 3.250000 0.625000
v -0.624269 5.016733 0.625000
v 0.624999 3.250000 -0.624269
v 0.624999 5.016733 -0.624269
v 0.625000 5.016734 0.625000
v 0.625000 3.250000 0.625000
v -0.624269 5.016734 -0.624268
v -0.624269 3.250000 -0.624268
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 -0.000000
vt 1.000000 1.000000
vt -0.000000 1.000000
vt -0.000000 -0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 1.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 1.000000 0.500000
vt 0.000000 0.500000
vt 0.500000 0.000000
vt 1.000000 0.500000
vt -0.000000 0.500000
vt 1.000000 0.500000
vt 0.000000 0.500000
vt 1.000000 0.500000
vt 0.000000 0.500000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vn 0.7071 0.0000 -0.7071
vn 0.7071 0.0000 0.7071
vn 0.0000 1.0000 0.0000
vn 0.0000 0.0000 1.0000
vn -1.0000 0.0000 0.0000
vn 0.0000 -1.0000 0.0000
vn 1.0000 0.0000 0.0000
vn 0.0000 0.0000 -1.0000
vn -0.8660 0.5000 0.0000
vn 0.8660 0.5000 -0.0000
vn -0.0000 0.5000 -0.8660
vn 0.0000 0.5000 0.8660
vn -0.4472 0.8944 0.0000
vn 0.0000 0.8944 0.4472
vn 0.4472 0.8944 0.0000
vn -0.0000 0.8944 -0.4472
vn -0.7071 0.0000 -0.7071
g Cube_Cube_Roots
usemtl Roots
s off
f 3/1/1 7/2/1 8/3/1 4/4/1
f 1/5/2 5/6/2 6/7/2 2/8/2
g Cube_Cube_Luminophor
usemtl Luminophor
f 9/9/3 13/10/3 15/11/3 11/12/3
f 12/13/4 11/14/4 15/15/4 16/16/4
f 16/16/5 15/15/5 13/17/5 14/18/5
f 14/19/6 10/20/6 12/13/6 16/16/6
f 10/21/7 9/9/7 11/22/7 12/23/7
f 14/24/8 13/10/8 9/9/8 10/21/8
g Cube_Cube_Leaves
usemtl Leaves
f 17/25/9 18/26/9 20/27/9 19/28/9
f 21/29/5 22/30/5 24/31/5 23/32/5
f 25/33/9 26/34/9 28/35/9 27/36/9
f 29/37/9 30/38/9 32/39/9 31/40/9
f 33/41/9 34/42/9 36/43/9 35/44/9
f 37/45/10 38/46/10 40/47/10 39/48/10
f 41/49/7 42/50/7 44/51/7 43/52/7
f 45/53/10 46/54/10 48/55/10 47/56/10
f 49/57/10 50/58/10 52/59/10 51/60/10
f 53/61/10 54/62/10 56/63/10 55/64/10
f 57/65/11 58/66/11 60/67/11 59/68/11
f 61/69/8 62/70/8 64/71/8 63/72/8
f 65/73/11 66/74/11 68/75/11 67/76/11
f 69/77/11 70/78/11 72/79/11 71/80/11
f 73/81/11 74/82/11 76/83/11 75/84/11
f 77/85/12 78/86/12 80/87/12 79/88/12
f 81/89/4 82/90/4 84/91/4 83/92/4
f 85/93/12 86/94/12 88/95/12 87/96/12
f 89/97/12 90/98/12 92/99/12 91/100/12
f 93/101/12 94/102/12 96/103/12 95/104/12
f 97/105/13 98/106/13 101/107/13
f 98/108/14 100/109/14 101/107/14
f 100/110/15 99/111/15 101/107/15
f 99/112/16 97/113/16 101/107/16
f 105/114/17 104/115/17 102/116/17 103/117/17
f 106/118/1 107/119/1 109/120/1 108/121/1
@@ -0,0 +1,436 @@
# Blender 5.2.1 LTS
# www.blender.org
mtllib everness_hammer_pick.mtl
g hammer_head.vox_hammer_head.vox
v 0.117043 0.562218 -0.240000
v 0.117043 0.562218 0.240000
v -0.222369 0.901630 -0.240000
v -0.561780 -0.116604 -0.240000
v -0.901191 0.222807 0.240000
v -0.561780 -0.116604 0.240000
v -0.222369 0.901630 0.240000
v -0.901191 0.222807 -0.240000
v 0.097391 -0.177433 0.040000
v -0.142609 -0.017433 -0.040000
v -0.222609 0.062567 0.040000
v -0.222609 0.062567 -0.040000
v -0.142609 0.062567 -0.040000
v -0.382609 0.222567 -0.040000
v 0.577391 -0.337433 -0.040000
v 0.417391 -0.337433 -0.040000
v 0.417391 -0.337433 0.040000
v 0.417391 -0.257433 -0.040000
v 0.337391 -0.257433 0.040000
v 0.337391 -0.177433 0.040000
v 0.337391 -0.177433 -0.040000
v 0.257391 -0.177433 0.040000
v 0.257391 -0.097433 0.040000
v 0.177391 -0.017433 -0.040000
v 0.017391 0.062567 -0.040000
v -0.062609 0.222567 0.040000
v -0.142609 0.302567 -0.040000
v -0.222609 0.302567 0.040000
v -0.222609 0.382567 0.040000
v 0.577391 -0.577433 0.040000
v 0.417391 -0.257433 0.040000
v 0.257391 -0.417433 0.040000
v 0.257391 -0.337433 0.040000
v 0.177391 -0.257433 0.040000
v 0.177391 -0.337433 0.040000
v 0.097391 -0.257433 0.040000
v 0.177391 -0.097433 0.040000
v 0.097391 -0.017433 0.040000
v 0.017391 0.062567 0.040000
v -0.062609 -0.017433 0.040000
v -0.062609 0.142567 0.040000
v -0.142609 -0.017433 0.040000
v -0.142609 0.062567 0.040000
v -0.142609 0.222567 0.040000
v -0.222609 0.142567 0.040000
v -0.142609 0.302567 0.040000
v -0.302609 0.302567 0.040000
v -0.302609 0.222567 0.040000
v -0.382609 0.222567 0.040000
v 0.257391 -0.337433 -0.040000
v 0.257391 -0.177433 -0.040000
v 0.257391 -0.097433 -0.040000
v 0.177391 -0.257433 -0.040000
v 0.097391 -0.257433 -0.040000
v 0.097391 -0.177433 -0.040000
v 0.017391 -0.177433 -0.040000
v 0.017391 -0.097433 -0.040000
v 0.097391 -0.017433 -0.040000
v -0.062609 -0.017433 -0.040000
v 0.017391 0.142567 -0.040000
v -0.062609 0.222567 -0.040000
v -0.222609 0.142567 -0.040000
v -0.302609 0.222567 -0.040000
v -0.302609 0.302567 -0.040000
v -0.222609 0.302567 -0.040000
v -0.222609 0.382567 -0.040000
v 0.577391 -0.577433 -0.040000
v 0.577391 -0.337433 0.040000
v 0.337391 -0.257433 -0.040000
v 0.177391 -0.097433 -0.040000
v 0.177391 -0.017433 0.040000
v 0.097391 0.062567 -0.040000
v 0.097391 0.062567 0.040000
v 0.017391 0.142567 0.040000
v -0.062609 0.142567 -0.040000
v -0.142609 0.222567 -0.040000
v 0.337391 -0.577433 0.040000
v 0.337391 -0.577433 -0.040000
v 0.337391 -0.417433 0.040000
v 0.337391 -0.417433 -0.040000
v 0.257391 -0.417433 -0.040000
v 0.177391 -0.337433 -0.040000
v 0.017391 -0.177433 0.040000
v 0.017391 -0.097433 0.040000
v -0.062609 -0.097433 0.040000
v -0.062609 -0.097433 -0.040000
v -0.302609 0.142567 0.040000
v -0.302609 0.142567 -0.040000
v -0.302609 0.382567 0.040000
v -0.302609 0.382567 -0.040000
v -0.382609 0.302567 0.040000
v -0.382609 0.302567 -0.040000
v 0.122134 0.563916 -0.242400
v 0.122134 0.563916 0.242400
v -0.220672 0.906721 -0.242400
v -0.563477 -0.121695 -0.242400
v -0.906282 0.221110 0.242400
v -0.563477 -0.121695 0.242400
v -0.220672 0.906721 0.242400
v -0.906282 0.221110 -0.242400
vn -0.0000 -0.0000 1.0000
vn 0.7071 0.7071 -0.0000
vn -0.7071 -0.7071 -0.0000
vn 0.7071 -0.7071 -0.0000
vn -0.0000 -0.0000 -1.0000
vn -0.7071 0.7071 -0.0000
vn -0.0000 -1.0000 -0.0000
vn -0.0000 1.0000 -0.0000
vn 1.0000 -0.0000 -0.0000
vn -1.0000 -0.0000 -0.0000
vn 0.2858 0.2858 -0.9147
vn -0.1526 -0.1526 -0.9764
vn -0.2858 -0.2858 0.9147
vn -0.6155 -0.6155 0.4924
vn -0.1526 -0.1526 0.9764
vn 0.5645 0.5645 0.6022
vt 0.500000 1.000000
vt 0.000000 0.750000
vt 0.000000 1.000000
vt 0.500000 0.750000
vt 0.750000 1.000000
vt 1.000000 0.750000
vt 1.000000 1.000000
vt 0.000000 0.000000
vt 0.500000 0.250000
vt 0.500000 0.000000
vt 0.500000 0.500000
vt 0.000000 0.250000
vt 0.000000 0.880000
vt 0.071429 1.000000
vt 0.000000 0.760000
vt 0.071429 0.800000
vt 0.000000 0.800000
vt 0.000000 0.640000
vt 0.071429 0.720000
vt 0.000000 0.720000
vt 0.000000 0.560000
vt 0.071429 0.600000
vt 0.000000 0.600000
vt 0.000000 0.480000
vt 0.071429 0.520000
vt 0.000000 0.520000
vt 0.000000 0.400000
vt 0.071429 0.440000
vt 0.000000 0.440000
vt 0.000000 0.320000
vt 0.071429 0.360000
vt 0.000000 0.360000
vt 0.000000 0.240000
vt 0.071429 0.280000
vt 0.000000 0.280000
vt 0.000000 0.160000
vt 0.071429 0.200000
vt 0.000000 0.200000
vt 0.000000 0.080000
vt 0.071429 0.120000
vt 0.000000 0.120000
vt 0.071429 0.760000
vt 0.142857 0.720000
vt 0.142857 0.760000
vt 0.071429 0.640000
vt 0.142857 0.600000
vt 0.142857 0.640000
vt 0.071429 0.560000
vt 0.142857 0.520000
vt 0.142857 0.560000
vt 0.071429 0.480000
vt 0.142857 0.440000
vt 0.142857 0.480000
vt 0.071429 0.400000
vt 0.142857 0.360000
vt 0.142857 0.400000
vt 0.071429 0.320000
vt 0.142857 0.280000
vt 0.142857 0.320000
vt 0.071429 0.240000
vt 0.142857 0.200000
vt 0.142857 0.240000
vt 0.071429 0.160000
vt 0.142857 0.120000
vt 0.142857 0.160000
vt 0.071429 0.080000
vt 0.142857 0.040000
vt 0.142857 0.080000
vt 0.071429 0.000000
vt 0.000000 0.040000
vt 0.642857 0.760000
vt 0.571429 0.800000
vt 0.428571 0.640000
vt 0.357143 0.680000
vt 0.142857 0.880000
vt 0.071429 0.880000
vt 0.142857 1.000000
vt 0.142857 0.800000
vt 0.142857 0.000000
vt 0.750000 0.750000
vt 0.000000 0.500000
vt 0.071429 0.040000
vt 0.285714 0.680000
vt 0.285714 0.640000
vt 0.357143 0.520000
vt 0.357143 0.600000
vt 0.428571 0.600000
vt 0.500000 0.640000
vt 0.500000 0.680000
vt 0.571429 0.680000
vt 0.571429 0.720000
vt 0.642857 0.720000
vt 0.714286 0.760000
vt 0.714286 0.800000
vt 0.785714 0.800000
vt 0.785714 0.840000
vt 0.857143 0.840000
vt 0.857143 0.880000
vt 0.928571 0.880000
vt 0.928571 0.920000
vt 1.000000 0.920000
vt 1.000000 0.960000
vt 0.928571 0.960000
vt 0.928571 1.000000
vt 0.857143 1.000000
vt 0.857143 0.960000
vt 0.785714 0.960000
vt 0.785714 0.920000
vt 0.714286 0.920000
vt 0.714286 0.880000
vt 0.642857 0.880000
vt 0.642857 0.840000
vt 0.571429 0.840000
vt 0.500000 0.800000
vt 0.500000 0.760000
vt 0.428571 0.760000
vt 0.428571 0.720000
vt 0.357143 0.720000
s 0
g hammer
g hammer_head.vox_hammer
usemtl hammer
f 5/1/1 2/2/1 7/3/1
f 2/4/2 3/5/2 7/1/2
f 4/6/3 5/5/3 8/7/3
f 6/8/4 1/9/4 2/10/4
f 3/2/5 4/11/5 8/4/5
f 3/11/6 5/12/6 7/9/6
f 5/1/1 6/4/1 2/2/1
f 2/4/2 1/80/2 3/5/2
f 4/6/3 6/80/3 5/5/3
f 6/8/4 4/12/4 1/9/4
f 3/2/5 1/81/5 4/11/5
f 3/11/6 8/81/6 5/12/6
g handle
g hammer_head.vox_handle
usemtl handle
f 77/13/7 67/14/7 30/3/7
f 32/15/7 80/16/7 79/17/7
f 35/18/7 50/19/7 33/20/7
f 36/21/7 53/22/7 34/23/7
f 83/24/7 55/25/7 9/26/7
f 85/27/7 57/28/7 84/29/7
f 42/30/7 59/31/7 40/32/7
f 11/33/7 13/34/7 43/35/7
f 87/36/7 62/37/7 45/38/7
f 49/39/7 63/40/7 48/41/7
f 18/42/8 19/43/8 31/44/8
f 21/45/8 22/46/8 20/47/8
f 52/48/8 37/49/8 23/50/8
f 24/51/8 38/52/8 71/53/8
f 72/54/8 39/55/8 73/56/8
f 60/57/8 41/58/8 74/59/8
f 61/60/8 44/61/8 26/62/8
f 27/63/8 28/64/8 46/65/8
f 66/66/8 89/67/8 29/68/8
f 64/69/8 91/70/8 47/8/8
f 67/49/5 57/71/5 58/72/5
f 84/71/1 33/73/1 19/74/1
f 16/16/8 68/75/8 15/76/8
f 15/76/9 30/77/9 67/14/9
f 16/16/9 31/44/9 17/78/9
f 69/19/9 20/47/9 19/43/9
f 51/22/9 23/50/9 22/46/9
f 70/25/9 71/53/9 37/49/9
f 58/28/9 73/56/9 38/52/9
f 25/31/9 74/59/9 39/55/9
f 75/34/9 26/62/9 41/58/9
f 76/37/9 46/65/9 44/61/9
f 65/40/9 29/68/9 28/64/9
f 33/20/10 81/42/10 32/15/10
f 34/23/10 82/45/10 35/18/10
f 9/26/10 54/48/10 36/21/10
f 84/29/10 56/51/10 83/24/10
f 40/32/10 86/54/10 85/27/10
f 42/30/10 13/34/10 10/57/10
f 45/38/10 12/60/10 11/33/10
f 48/41/10 88/63/10 87/36/10
f 89/67/10 64/69/10 47/79/10
f 91/70/10 14/66/10 49/39/10
f 80/16/10 77/13/10 79/17/10
f 77/13/7 78/76/7 67/14/7
f 32/15/7 81/42/7 80/16/7
f 35/18/7 82/45/7 50/19/7
f 36/21/7 54/48/7 53/22/7
f 83/24/7 56/51/7 55/25/7
f 85/27/7 86/54/7 57/28/7
f 42/30/7 10/57/7 59/31/7
f 11/33/7 12/60/7 13/34/7
f 87/36/7 88/63/7 62/37/7
f 49/39/7 14/66/7 63/40/7
f 18/42/8 69/19/8 19/43/8
f 21/45/8 51/22/8 22/46/8
f 52/48/8 70/25/8 37/49/8
f 24/51/8 58/28/8 38/52/8
f 72/54/8 25/31/8 39/55/8
f 60/57/8 75/34/8 41/58/8
f 61/60/8 76/37/8 44/61/8
f 27/63/8 65/40/8 28/64/8
f 66/66/8 90/82/8 89/67/8
f 64/69/8 92/82/8 91/70/8
f 69/74/5 18/83/5 16/84/5
f 16/84/5 15/47/5 67/49/5
f 67/49/5 78/85/5 80/86/5
f 80/86/5 81/87/5 50/73/5
f 50/73/5 82/88/5 53/89/5
f 53/89/5 54/90/5 55/91/5
f 55/91/5 56/92/5 57/71/5
f 57/71/5 86/93/5 59/94/5
f 59/94/5 10/95/5 13/96/5
f 13/96/5 12/97/5 62/98/5
f 62/98/5 88/99/5 63/100/5
f 63/100/5 14/101/5 92/102/5
f 64/103/5 90/104/5 66/105/5
f 63/100/5 92/102/5 64/103/5
f 62/98/5 63/100/5 64/103/5
f 64/103/5 66/105/5 65/106/5
f 65/106/5 27/107/5 76/108/5
f 76/108/5 61/109/5 75/110/5
f 75/110/5 60/111/5 25/112/5
f 25/112/5 72/113/5 58/72/5
f 58/72/5 24/114/5 70/115/5
f 70/115/5 52/116/5 51/117/5
f 51/117/5 21/118/5 69/74/5
f 69/74/5 16/84/5 67/49/5
f 67/49/5 80/86/5 50/73/5
f 53/89/5 55/91/5 57/71/5
f 67/49/5 50/73/5 53/89/5
f 51/117/5 69/74/5 67/49/5
f 58/72/11 70/115/11 51/117/11
f 75/110/12 25/112/12 58/72/12
f 65/106/11 76/108/11 75/110/11
f 62/98/5 64/103/5 65/106/5
f 57/71/5 59/94/5 13/96/5
f 13/96/5 62/98/5 65/106/5
f 13/96/5 65/106/5 75/110/5
f 67/49/5 53/89/5 57/71/5
f 57/71/5 13/96/5 75/110/5
f 58/72/5 51/117/5 67/49/5
f 57/71/5 75/110/5 58/72/5
f 38/72/1 73/113/1 39/112/1
f 39/112/1 74/111/1 41/110/1
f 41/110/1 26/109/1 44/108/1
f 44/108/1 46/107/1 28/106/1
f 28/106/1 29/105/1 89/104/1
f 47/103/1 91/102/1 49/101/1
f 28/106/1 89/104/1 47/103/1
f 41/110/13 44/108/13 28/106/13
f 38/72/1 39/112/1 41/110/1
f 37/115/1 71/114/1 38/72/1
f 22/117/1 23/116/1 37/115/1
f 19/74/1 20/118/1 22/117/1
f 17/84/1 31/83/1 19/74/1
f 30/49/1 68/47/1 17/84/1
f 79/86/1 77/85/1 30/49/1
f 33/73/1 32/87/1 79/86/1
f 34/89/1 35/88/1 33/73/1
f 9/91/1 36/90/1 34/89/1
f 84/71/1 83/92/1 9/91/1
f 40/94/1 85/93/1 84/71/1
f 43/96/1 42/95/1 40/94/1
f 45/98/1 11/97/1 43/96/1
f 48/100/1 87/99/1 45/98/1
f 47/103/1 49/101/1 48/100/1
f 41/110/1 28/106/1 47/103/1
f 22/117/14 37/115/14 38/72/14
f 38/72/1 41/110/1 47/103/1
f 47/103/1 48/100/1 45/98/1
f 43/96/15 40/94/15 84/71/15
f 47/103/1 45/98/1 43/96/1
f 22/117/1 38/72/1 47/103/1
f 30/49/1 17/84/1 19/74/1
f 19/74/1 22/117/1 47/103/1
f 47/103/1 43/96/1 84/71/1
f 84/71/1 9/91/1 34/89/1
f 33/73/1 79/86/1 30/49/1
f 84/71/16 34/89/16 33/73/16
f 19/74/1 47/103/1 84/71/1
f 33/73/1 30/49/1 19/74/1
f 16/16/8 17/78/8 68/75/8
f 15/76/9 68/75/9 30/77/9
f 16/16/9 18/42/9 31/44/9
f 69/19/9 21/45/9 20/47/9
f 51/22/9 52/48/9 23/50/9
f 70/25/9 24/51/9 71/53/9
f 58/28/9 72/54/9 73/56/9
f 25/31/9 60/57/9 74/59/9
f 75/34/9 61/60/9 26/62/9
f 76/37/9 27/63/9 46/65/9
f 65/40/9 66/66/9 29/68/9
f 33/20/10 50/19/10 81/42/10
f 34/23/10 53/22/10 82/45/10
f 9/26/10 55/25/10 54/48/10
f 84/29/10 57/28/10 56/51/10
f 40/32/10 59/31/10 86/54/10
f 42/30/10 43/35/10 13/34/10
f 45/38/10 62/37/10 12/60/10
f 48/41/10 63/40/10 88/63/10
f 89/67/10 90/82/10 64/69/10
f 91/70/10 92/82/10 14/66/10
f 80/16/10 78/76/10 77/13/10
g glint
g hammer_head.vox_glint
usemtl glint
f 97/1/1 94/2/1 99/3/1
f 94/4/2 95/5/2 99/1/2
f 96/6/3 97/5/3 100/7/3
f 98/8/4 93/9/4 94/10/4
f 95/2/5 96/11/5 100/4/5
f 95/11/6 97/12/6 99/9/6
f 97/1/1 98/4/1 94/2/1
f 94/4/2 93/80/2 95/5/2
f 96/6/3 98/80/3 97/5/3
f 98/8/4 96/12/4 93/9/4
f 95/2/5 93/81/5 96/11/5
f 95/11/6 100/81/6 97/12/6
@@ -0,0 +1,235 @@
# Blender v2.83.20 OBJ File: 'everness_lotus_flower.blend'
# www.blender.org
mtllib everness_lotus_flower.mtl
o Cube
v -0.308107 -0.055472 -0.746216
v -0.009900 -0.499000 -0.342751
v 0.655918 0.011755 -0.265300
v -0.732371 -0.055472 -0.321952
v -0.328906 -0.499000 -0.023745
v -0.308107 -0.055472 0.698725
v 0.231654 0.011755 -0.689564
v 0.288417 -0.055942 0.698836
v 0.712681 -0.055942 0.274572
v -0.732371 -0.055472 0.274461
v -0.486053 -0.100909 -0.211530
v -0.160819 -0.498639 -0.160819
v 0.211530 -0.100909 -0.486054
v 0.160819 -0.498639 -0.160819
v -0.486053 -0.100909 0.211530
v -0.160819 -0.498639 0.160819
v 0.211530 -0.100909 0.486053
v 0.160819 -0.498639 0.160819
v -0.211530 -0.100909 -0.486054
v 0.486054 -0.100909 0.211530
v 0.486054 -0.100909 -0.211530
v -0.211530 -0.100909 0.486053
v 0.160592 -0.498186 0.160592
v 0.160592 -0.177003 0.160592
v -0.160592 -0.498186 0.160592
v -0.160592 -0.177003 0.160592
v 0.160592 -0.498186 -0.160592
v 0.160592 -0.177003 -0.160592
v -0.160592 -0.498186 -0.160592
v -0.160592 -0.177003 -0.160592
v 0.309302 -0.499453 -0.023720
v -0.009875 -0.499453 0.295457
v 0.000000 -0.330263 0.355694
v 0.000000 0.589835 0.355694
v -0.355694 -0.330263 -0.000000
v -0.355694 0.589835 -0.000000
v 0.355694 -0.330263 -0.000000
v 0.355694 0.589835 -0.000000
v 0.000000 -0.330263 -0.355694
v 0.000000 0.589835 -0.355694
v 0.500438 -0.055472 -0.534084
v 0.149602 -0.499000 -0.183248
v 0.548643 -0.154723 -0.000000
v 0.160819 -0.498639 -0.000000
v 0.000000 -0.154723 -0.548643
v 0.000000 -0.498639 -0.160819
v -0.160819 -0.498639 -0.000000
v -0.548642 -0.154723 -0.000000
v 0.000000 -0.498639 0.160819
v 0.000000 -0.154723 0.548642
v -0.169403 -0.499000 0.135758
v -0.567776 -0.135591 0.534130
v -0.169403 -0.499000 -0.183248
v -0.567776 -0.135591 -0.581621
v 0.548086 -0.136060 0.534241
v 0.150919 -0.498639 0.137074
vt 0.500000 0.750000
vt -0.000000 0.500000
vt 0.000000 0.750000
vt 0.500000 0.750000
vt -0.000000 0.500000
vt 0.000000 0.750000
vt 0.000000 0.250000
vt 0.500000 0.250000
vt 0.250000 0.000000
vt 0.500000 0.750000
vt 0.000000 0.500000
vt 0.000000 0.750000
vt 0.000000 1.000000
vt 0.875000 0.812500
vt 0.500000 0.625000
vt 0.500000 0.812500
vt 0.875000 0.812500
vt 0.500000 0.625000
vt 0.500000 0.812500
vt 0.875000 0.625000
vt 0.500000 0.250000
vt 0.875000 0.250000
vt 0.875000 0.625000
vt 0.500000 0.250000
vt 0.875000 0.250000
vt 0.875000 0.625000
vt 0.500000 0.250000
vt 0.875000 0.250000
vt 0.875000 0.625000
vt 0.500000 0.250000
vt 0.875000 0.250000
vt 0.500000 0.250000
vt 0.875000 0.250000
vt 0.000000 1.000000
vt 0.875000 0.812500
vt 0.500000 1.000000
vt 0.875000 1.000000
vt 0.500000 0.625000
vt 0.500000 0.812500
vt 0.500000 1.000000
vt 0.875000 1.000000
vt 0.875000 0.812500
vt 0.500000 0.625000
vt 0.500000 0.812500
vt 0.500000 1.000000
vt 0.875000 1.000000
vt 0.500000 1.000000
vt 0.875000 1.000000
vt -0.000000 1.000000
vt 0.500000 1.000000
vt 0.000000 1.000000
vt 0.500000 0.750000
vt 0.000000 0.750000
vt 0.000000 0.500000
vt 0.500000 0.500000
vt 0.500000 0.500000
vt -0.000000 0.000000
vt 0.500000 0.500000
vt 0.500000 0.000000
vt 0.500000 0.500000
vt 0.500000 1.000000
vt 0.875000 0.625000
vt 0.875000 0.625000
vt 0.500000 0.625000
vt 0.500000 0.625000
vt 0.500000 0.625000
vt 0.500000 0.625000
vt 0.500000 1.000000
vt 0.875000 0.625000
vt 0.875000 0.625000
vt 0.500000 1.000000
vt 0.500000 0.500000
vt 0.500000 0.000000
vt 0.500000 1.000000
vt 0.250000 1.000000
vt 0.250000 -0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.750000 1.000000
vt 0.750000 0.000000
vn -0.3842 0.8402 -0.3827
vn 0.3847 0.8403 -0.3819
vn 0.0000 1.0000 0.0000
vn -0.4713 0.7455 0.4713
vn 0.3833 0.8403 -0.3833
vn 0.0000 0.7482 0.6635
vn 0.6635 0.7482 -0.0000
vn 0.0000 0.0000 1.0000
vn -1.0000 0.0000 0.0000
vn 0.0000 0.0000 -1.0000
vn 1.0000 0.0000 0.0000
vn -0.4699 0.7455 0.4726
vn -0.6979 0.6171 -0.3635
vn -0.6635 0.7482 -0.0000
vn 0.6979 0.6171 0.3635
vn -0.0000 0.7482 -0.6635
vn 0.3635 0.6171 -0.6979
vn -0.3635 0.6171 0.6979
vn -0.1925 0.7280 -0.6580
vn 0.3833 0.8403 0.3833
vn -0.6580 0.7280 -0.1925
vn 0.1928 0.7276 -0.6584
vn 0.0014 1.0000 0.0014
vn -0.2680 0.6247 0.7334
vn 0.6580 0.7280 -0.1925
vn 0.3635 0.6171 0.6979
vn 0.6979 0.6171 -0.3635
vn -0.7337 0.6243 0.2683
vn -0.6979 0.6171 0.3635
vn -0.3635 0.6171 -0.6979
vn -0.3827 0.8402 -0.3842
vn 0.1925 0.7280 0.6580
vn 0.6580 0.7280 0.1925
vn -0.7071 0.0000 0.7071
vn -0.7071 0.0000 -0.7071
vn 0.7071 0.0000 -0.7071
vn 0.7071 0.0000 0.7071
g Cube_Cube_lotus
usemtl lotus
s off
f 55/1/1 31/2/1 56/3/1
f 52/4/2 32/5/2 51/6/2
f 51/7/3 42/8/3 53/9/3
f 41/10/4 2/11/4 42/12/4
f 5/13/5 52/4/5 51/6/5
f 45/14/6 12/15/6 46/16/6
f 48/17/7 16/18/7 47/19/7
f 24/20/8 25/21/8 23/22/8
f 26/23/9 29/24/9 25/25/9
f 30/26/10 27/27/10 29/28/10
f 28/29/11 23/30/11 27/31/11
f 26/23/3 28/32/3 30/33/3
f 31/34/12 41/10/12 42/12/12
f 43/35/13 18/36/13 20/37/13
f 43/35/14 14/38/14 44/39/14
f 48/17/15 12/40/15 11/41/15
f 50/42/16 18/43/16 49/44/16
f 50/42/17 16/45/17 22/46/17
f 45/14/18 14/47/18 13/48/18
f 55/1/19 32/49/19 8/50/19
f 2/51/20 54/52/20 53/53/20
f 54/52/20 5/54/20 53/53/20
f 55/1/21 9/55/21 31/2/21
f 52/4/22 6/56/22 32/5/22
f 53/9/3 5/57/3 51/7/3
f 51/7/23 32/5/23 31/58/23
f 42/8/3 2/59/3 53/9/3
f 51/7/23 31/58/23 42/8/23
f 41/10/24 7/60/24 2/11/24
f 5/13/25 10/61/25 52/4/25
f 45/14/26 19/62/26 12/15/26
f 48/17/27 15/63/27 16/18/27
f 24/20/8 26/64/8 25/21/8
f 26/23/9 30/65/9 29/24/9
f 30/26/10 28/66/10 27/27/10
f 28/29/11 24/67/11 23/30/11
f 26/23/3 24/67/3 28/32/3
f 31/34/28 3/68/28 41/10/28
f 43/35/14 44/39/14 18/36/14
f 43/35/29 21/69/29 14/38/29
f 48/17/7 47/19/7 12/40/7
f 50/42/30 17/70/30 18/43/30
f 50/42/16 49/44/16 16/45/16
f 45/14/6 46/16/6 14/47/6
f 55/1/31 56/3/31 32/49/31
f 2/51/32 1/71/32 54/52/32
f 54/52/33 4/72/33 5/54/33
g Cube_Cube_flies
usemtl flies
f 33/73/34 34/74/34 36/75/34 35/76/34
f 35/76/35 36/75/35 40/77/35 39/78/35
f 39/79/36 40/80/36 38/81/36 37/82/36
f 37/82/37 38/81/37 34/74/37 33/73/37
+88
View File
@@ -0,0 +1,88 @@
# Blender v2.83.20 OBJ File: 'everness_lumabus.blend'
# www.blender.org
mtllib everness_lumabus.mtl
o Cube
v 0.312500 -0.499500 0.312500
v 0.312500 0.125500 0.312500
v 0.312500 -0.499500 -0.312500
v 0.312500 0.125500 -0.312500
v -0.312500 -0.499500 0.312500
v -0.312500 0.125500 0.312500
v -0.312500 -0.499500 -0.312500
v -0.312500 0.125500 -0.312500
v 0.312500 -0.499828 0.312500
v 0.791278 -0.098086 0.312500
v 0.312500 -0.499828 -0.312500
v 0.312500 -0.098086 -0.791278
v -0.312500 -0.499828 0.312500
v -0.312500 -0.098086 0.791278
v -0.312500 -0.499828 -0.312500
v -0.312500 -0.098086 -0.791278
v -0.791278 -0.098086 -0.312500
v 0.791278 -0.098086 -0.312500
v 0.312500 -0.098086 0.791278
v -0.791278 -0.098086 0.312500
vt 0.750000 0.500000
vt 0.250000 0.500000
vt 0.250000 0.000000
vt 0.750000 0.000000
vt 0.750000 0.500000
vt 0.750000 1.000000
vt 0.250000 1.000000
vt 0.250000 0.500000
vt 0.750000 1.000000
vt 0.750000 0.500000
vt 0.250000 0.500000
vt 0.750000 0.500000
vt 0.750000 0.000000
vt 0.250000 0.000000
vt 0.750000 1.000000
vt 0.250000 1.000000
vt 0.250000 0.500000
vt 0.250000 1.000000
vt 0.681818 0.681818
vt 0.318182 0.681818
vt 0.318182 0.318182
vt 0.681818 0.318182
vt 0.681818 -0.000000
vt 0.681818 0.363636
vt 0.318182 0.363636
vt 0.318182 -0.000000
vt -0.000000 0.318182
vt 0.363636 0.318182
vt 0.363636 0.681818
vt -0.000000 0.681818
vt 1.000000 0.681818
vt 0.636364 0.681818
vt 0.636364 0.318182
vt 1.000000 0.318182
vt 0.318182 1.000000
vt 0.318182 0.636364
vt 0.681818 0.636364
vt 0.681818 1.000000
vn 0.0000 -1.0000 -0.0000
vn 0.0000 0.0000 -1.0000
vn -1.0000 -0.0000 0.0000
vn 0.0000 1.0000 0.0000
vn 1.0000 0.0000 0.0000
vn 0.0000 -0.0000 1.0000
vn 0.0000 -0.7660 -0.6428
vn -0.6428 -0.7660 -0.0000
vn 0.6428 -0.7660 -0.0000
vn 0.0000 -0.7660 0.6428
g Cube_Cube_bulb
usemtl bulb
s off
f 1/1/1 5/2/1 7/3/1 3/4/1
f 4/5/2 3/6/2 7/7/2 8/8/2
f 8/8/3 7/7/3 5/9/3 6/10/3
f 6/11/4 2/12/4 4/13/4 8/14/4
f 2/12/5 1/15/5 3/16/5 4/17/5
f 6/11/6 5/18/6 1/15/6 2/12/6
g Cube_Cube_leaves
usemtl leaves
f 9/19/1 13/20/1 15/21/1 11/22/1
f 12/23/7 11/24/7 15/25/7 16/26/7
f 17/27/8 15/28/8 13/29/8 20/30/8
f 10/31/9 9/32/9 11/33/9 18/34/9
f 14/35/10 13/36/10 9/37/10 19/38/10
@@ -0,0 +1,84 @@
# Blender v2.83.20 OBJ File: 'everness_lumecorn.blend'
# www.blender.org
mtllib everness_lumecorn.mtl
o Cube
v 0.441942 0.750000 -0.441942
v 0.441942 -0.500000 -0.441942
v -0.441942 0.750000 0.441942
v -0.441942 -0.500000 0.441942
v -0.441942 0.750000 -0.441942
v -0.441942 -0.500000 -0.441942
v 0.441942 0.750000 0.441942
v 0.441942 -0.500000 0.441942
v 1.767767 0.350000 0.000000
v -0.000000 0.350000 -1.767767
v 0.000000 0.350000 1.767767
v -1.767767 0.350000 -0.000000
v -0.883883 0.750000 -0.883883
v 0.883883 0.750000 0.883883
v -0.883883 0.750000 0.883883
v 0.883883 0.750000 -0.883883
v 0.000000 0.750000 0.000000
v -0.441942 5.750000 -0.441942
v -0.441942 0.750000 -0.441942
v 0.441942 5.750000 0.441942
v 0.441942 0.750000 0.441942
v -0.441942 5.750000 0.441942
v -0.441942 0.750000 0.441942
v 0.441942 5.750000 -0.441942
v 0.441942 0.750000 -0.441942
vt 0.999900 0.000100
vt 0.999900 0.999900
vt 0.000100 0.999900
vt 0.000100 0.000100
vt 0.999900 0.000100
vt 0.999900 0.999900
vt 0.000100 0.999900
vt 0.000100 0.000100
vt 0.000000 0.500000
vt 0.500000 1.000000
vt 1.000000 0.500000
vt 1.000000 0.500000
vt 0.500000 0.000000
vt 0.000000 0.500000
vt 1.000000 0.500000
vt 0.000000 0.500000
vt 0.000000 0.500000
vt 0.500000 1.000000
vt 1.000000 0.500000
vt 0.500000 1.000000
vt 0.500000 1.000000
vt 0.999900 0.000100
vt 0.999900 0.999900
vt 0.000100 0.999900
vt 0.000100 0.000100
vt 0.999900 0.000100
vt 0.999900 0.999900
vt 0.000100 0.999900
vt 0.000100 0.000100
vn -0.7071 0.0000 0.7071
vn 0.7071 0.0000 0.7071
vn 0.0000 -0.9111 -0.4123
vn 0.0000 -1.0000 0.0000
vn -0.4123 -0.9111 0.0000
vn -0.0000 -0.9111 0.4123
vn 0.4123 -0.9111 -0.0000
g Cube_Cube_root
usemtl root
s off
f 8/1/1 7/2/1 5/3/1 6/4/1
f 2/5/2 1/6/2 3/7/2 4/8/2
g Cube_Cube_leaves
usemtl leaves
f 14/9/3 11/10/3 15/11/3
f 13/12/4 17/13/4 15/14/4
f 16/15/4 17/13/4 13/16/4
f 16/17/5 9/18/5 14/19/5
f 17/13/4 14/9/4 15/11/4
f 17/13/4 16/17/4 14/19/4
f 10/20/6 16/15/6 13/16/6
f 12/21/7 13/12/7 15/14/7
g Cube_Cube_light
usemtl light
f 21/22/1 20/23/1 18/24/1 19/25/1
f 25/26/2 24/27/2 22/28/2 23/29/2
@@ -0,0 +1,243 @@
# Blender v2.83.20 OBJ File: 'everness_mineral_torch.blend'
# www.blender.org
mtllib everness_mineral_torch.mtl
o everness_mineral_torch.vox
v -0.062500 -0.490000 0.062500
v -0.062500 0.135000 0.062500
v -0.125000 0.135000 -0.125000
v -0.125000 0.385000 0.125000
v -0.000000 0.510000 0.062500
v -0.000000 0.447500 0.062500
v 0.000000 0.447500 0.250000
v 0.125000 0.385000 -0.125000
v -0.000000 -0.052500 0.062500
v 0.062500 -0.490000 0.062500
v 0.000000 0.447500 0.187500
v -0.000000 0.010000 0.062500
v 0.000000 0.135000 0.187500
v 0.125000 0.385000 0.125000
v 0.000000 0.385000 -0.187500
v -0.000000 0.072500 0.125000
v 0.000000 0.447500 -0.062500
v 0.000000 0.385000 0.250000
v -0.000000 0.010000 0.125000
v 0.000000 -0.052500 -0.125000
v 0.000000 0.010000 -0.125000
v -0.000000 -0.052500 0.125000
v 0.000000 0.010000 -0.187500
v 0.000000 0.072500 -0.187500
v 0.000000 0.072500 -0.250000
v 0.000000 0.135000 -0.250000
v 0.000000 0.510000 0.187500
v 0.062500 0.135000 -0.125000
v 0.000000 0.135000 -0.312500
v -0.125000 0.385000 -0.125000
v 0.000000 0.385000 -0.312500
v 0.000000 0.385000 0.312500
v 0.000000 0.510000 -0.187500
v 0.000000 0.135000 0.312500
v -0.062500 -0.490000 -0.062500
v 0.000000 0.385000 0.187500
v 0.062500 -0.490000 -0.062500
v 0.000000 0.135000 0.250000
v 0.000000 0.072500 0.250000
v 0.000000 0.072500 0.187500
v -0.125000 0.135000 0.125000
v 0.062500 0.135000 0.062500
v 0.125000 0.135000 0.125000
v -0.125000 0.135000 -0.062500
v -0.062500 0.135000 -0.062500
v 0.062500 0.135000 -0.062500
v 0.125000 0.135000 -0.125000
v 0.000000 0.385000 -0.250000
v 0.000000 0.072500 -0.125000
v 0.000000 0.135000 -0.187500
v 0.000000 0.010000 0.187500
v 0.000000 0.010000 -0.062500
v 0.000000 0.447500 -0.187500
v 0.000000 -0.052500 -0.062500
v 0.000000 0.447500 -0.250000
v 0.000000 0.510000 -0.062500
v 0.196875 0.072500 0.187500
v -0.178125 0.072500 0.187500
v -0.178125 0.447500 -0.187500
v 0.196875 0.447500 0.187500
v 0.196875 0.447500 -0.187500
v -0.178125 0.447500 0.187500
v -0.178125 0.072500 -0.187500
v 0.196875 0.072500 -0.187500
vt 0.250000 0.500000
vt 0.187500 0.437500
vt 0.250000 0.437500
vt 0.187500 0.562500
vt 0.125000 0.500000
vt 0.187500 0.500000
vt 0.250000 0.625000
vt 0.437500 0.875000
vt 0.187500 0.875000
vt 0.125000 0.625000
vt 0.062500 0.562500
vt 0.125000 0.562500
vt 0.125000 0.937500
vt 0.062500 0.875000
vt 0.125000 0.875000
vt 0.375000 0.000000
vt 0.250000 0.625000
vt 0.250000 0.000000
vt 0.375000 0.000000
vt 0.250000 0.625000
vt 0.250000 0.000000
vt 0.125000 1.000000
vt 0.250000 0.937500
vt 0.250000 1.000000
vt 0.187500 0.875000
vt 0.437500 0.625000
vt 0.437500 0.875000
vt 0.187500 0.625000
vt 0.187500 0.875000
vt 0.375000 0.625000
vt 0.500000 0.625000
vt 0.562500 0.562500
vt 0.500000 0.562500
vt 0.250000 0.625000
vt 0.437500 0.875000
vt 0.000000 0.625000
vt 0.062500 0.625000
vt 0.187500 0.875000
vt 0.437500 0.625000
vt 0.437500 0.875000
vt 0.562500 0.875000
vt 0.625000 0.625000
vt 0.562500 0.625000
vt 0.500000 0.937500
vt 0.500000 0.875000
vt 0.437500 0.562500
vt 0.500000 0.500000
vt 0.437500 0.500000
vt 0.250000 -0.000000
vt 0.125000 0.125000
vt 0.125000 -0.000000
vt 0.187500 0.625000
vt 0.437500 0.625000
vt 0.250000 0.687500
vt 0.375000 0.812500
vt 0.437500 0.812500
vt 0.437500 0.875000
vt 0.375000 0.500000
vt 0.437500 0.437500
vt 0.375000 0.437500
vt 0.500000 1.000000
vt 0.375000 0.937500
vt 0.375000 1.000000
vt 0.187500 0.625000
vt 0.062500 0.937500
vt 0.375000 0.625000
vt 0.187500 0.625000
vt 0.437500 0.625000
vt 0.187500 0.625000
vt 0.437500 0.625000
vt 0.000000 0.875000
vt 0.625000 0.875000
vt 0.562500 0.937500
vt 0.250000 0.125000
vt 0.250000 0.812500
vt 0.250000 0.875000
vt 0.187500 0.875000
vt 0.375000 0.687500
vt 0.333333 1.000000
vt 0.500000 -0.000000
vt 0.500000 1.000000
vt 0.666667 -0.000000
vt 0.166667 -0.000000
vt 0.166667 1.000000
vt 0.833333 -0.000000
vt 0.666667 1.000000
vt 0.666667 -0.000000
vt 0.000000 1.000000
vt 0.000000 -0.000000
vt 1.000000 -0.000000
vt 0.833333 1.000000
vt 0.833333 -0.000000
vt 0.333333 -0.000000
vt 0.666667 1.000000
vt 0.833333 1.000000
vt 1.000000 1.000000
vn -1.0000 0.0000 0.0000
vn 1.0000 0.0000 0.0000
vn 0.0000 1.0000 0.0000
vn 0.0000 0.0000 1.0000
vn 0.0000 0.0000 -1.0000
vn 0.0000 -1.0000 0.0000
g everness_mineral_torch.vox_everness_mineral_torch.vox_torch
usemtl torch
s off
f 52/1/1 20/2/1 54/3/1
f 49/4/1 23/5/1 21/6/1
f 44/7/1 4/8/1 30/9/1
f 50/10/1 25/11/1 24/12/1
f 53/13/1 48/14/1 15/15/1
f 1/16/1 45/17/1 35/18/1
f 37/19/2 42/20/2 10/21/2
f 33/22/1 17/23/1 56/24/1
f 8/25/3 4/26/3 14/27/3
f 42/20/4 1/16/4 10/21/4
f 41/28/4 14/27/4 4/29/4
f 46/30/5 35/18/5 45/17/5
f 13/31/2 39/32/2 40/33/2
f 28/34/5 30/35/5 8/25/5
f 48/14/1 29/36/1 26/37/1
f 14/38/2 47/39/2 8/40/2
f 18/41/2 34/42/2 38/43/2
f 11/44/2 18/41/2 36/45/2
f 16/46/2 51/47/2 19/48/2
f 1/49/6 37/50/6 10/51/6
f 43/52/6 41/53/6 42/54/6
f 45/55/6 44/56/6 3/57/6
f 12/58/2 22/59/2 9/60/2
f 27/61/2 6/62/2 5/63/2
f 52/1/1 21/6/1 20/2/1
f 49/4/1 24/12/1 23/5/1
f 30/9/1 3/64/1 44/7/1
f 44/7/1 41/53/1 4/8/1
f 50/10/1 26/37/1 25/11/1
f 53/13/1 55/65/1 48/14/1
f 1/16/1 2/66/1 45/17/1
f 37/19/2 46/30/2 42/20/2
f 33/22/1 53/13/1 17/23/1
f 8/25/3 30/67/3 4/26/3
f 42/20/4 2/66/4 1/16/4
f 41/28/4 43/68/4 14/27/4
f 46/30/5 37/19/5 35/18/5
f 13/31/2 38/43/2 39/32/2
f 8/25/5 47/69/5 28/34/5
f 28/34/5 3/70/5 30/35/5
f 48/14/1 31/71/1 29/36/1
f 14/38/2 43/52/2 47/39/2
f 18/41/2 32/72/2 34/42/2
f 11/44/2 7/73/2 18/41/2
f 16/46/2 40/33/2 51/47/2
f 1/49/6 35/74/6 37/50/6
f 42/54/6 46/75/6 43/52/6
f 46/75/6 28/76/6 47/77/6
f 43/52/6 46/75/6 47/77/6
f 41/53/6 44/56/6 2/78/6
f 44/56/6 45/55/6 2/78/6
f 41/53/6 2/78/6 42/54/6
f 3/57/6 28/76/6 45/55/6
f 28/76/6 46/75/6 45/55/6
f 12/58/2 19/48/2 22/59/2
f 27/61/2 11/44/2 6/62/2
g everness_mineral_torch.vox_everness_mineral_torch.vox_particle_cube
usemtl particle_cube
f 60/79/2 64/80/2 61/81/2
f 63/82/5 61/81/5 64/80/5
f 58/83/4 60/79/4 62/84/4
f 61/85/3 62/86/3 60/87/3
f 58/83/1 59/88/1 63/89/1
f 58/90/6 64/91/6 57/92/6
f 60/79/2 57/93/2 64/80/2
f 63/82/5 59/94/5 61/81/5
f 58/83/4 57/93/4 60/79/4
f 61/85/3 59/95/3 62/86/3
f 58/83/1 62/84/1 59/88/1
f 58/90/6 63/96/6 64/91/6
@@ -0,0 +1,243 @@
# Blender v2.83.20 OBJ File: 'everness_mineral_torch_wall.blend'
# www.blender.org
mtllib everness_mineral_torch_ceiling.mtl
o everness_mineral_torch.vox
v 0.062500 -0.561250 -0.170873
v 0.062500 -0.019984 0.141627
v -0.125000 -0.051234 0.195753
v 0.125000 0.165272 0.320753
v 0.062500 0.336025 0.275000
v 0.062500 0.281899 0.243750
v 0.250000 0.281899 0.243750
v -0.125000 0.290272 0.104247
v 0.062500 -0.151114 -0.006250
v 0.062500 -0.498750 -0.279127
v 0.187500 0.281899 0.243750
v 0.062500 -0.096987 0.025000
v 0.187500 0.011266 0.087500
v 0.125000 0.290272 0.104247
v -0.187500 0.227772 0.212500
v 0.125000 -0.042861 0.056250
v -0.062500 0.281899 0.243750
v 0.250000 0.227772 0.212500
v 0.125000 -0.096987 0.025000
v -0.125000 -0.151114 -0.006250
v -0.125000 -0.096987 0.025000
v 0.125000 -0.151114 -0.006250
v -0.187500 -0.096987 0.025000
v -0.187500 -0.042861 0.056250
v -0.250000 -0.042861 0.056250
v -0.250000 0.011266 0.087500
v 0.187500 0.336025 0.275000
v -0.125000 0.042516 0.033373
v -0.312500 0.011266 0.087500
v -0.125000 0.165272 0.320753
v -0.312500 0.227772 0.212500
v 0.312500 0.227772 0.212500
v -0.187500 0.336025 0.275000
v 0.312500 0.011266 0.087500
v -0.062500 -0.561250 -0.170873
v 0.187500 0.227772 0.212500
v -0.062500 -0.498750 -0.279127
v 0.250000 0.011266 0.087500
v 0.250000 -0.042861 0.056250
v 0.187500 -0.042861 0.056250
v 0.125000 -0.051234 0.195753
v 0.062500 0.042516 0.033373
v 0.125000 0.073766 -0.020753
v -0.062500 -0.051234 0.195753
v -0.062500 -0.019984 0.141627
v -0.062500 0.042516 0.033373
v -0.125000 0.073766 -0.020753
v -0.250000 0.227772 0.212500
v -0.125000 -0.042861 0.056250
v -0.187500 0.011266 0.087500
v 0.187500 -0.096987 0.025000
v -0.062500 -0.096987 0.025000
v -0.187500 0.281899 0.243750
v -0.062500 -0.151114 -0.006250
v -0.250000 0.281899 0.243750
v -0.062500 0.336025 0.275000
v 0.187500 0.055577 -0.114249
v 0.187500 -0.131923 0.210511
v -0.187500 0.192836 0.398011
v 0.187500 0.380336 0.073251
v -0.187500 0.380336 0.073251
v 0.187500 0.192836 0.398011
v -0.187500 -0.131923 0.210511
v -0.187500 0.055577 -0.114249
vt 0.250000 0.500000
vt 0.187500 0.437500
vt 0.250000 0.437500
vt 0.187500 0.562500
vt 0.125000 0.500000
vt 0.187500 0.500000
vt 0.250000 0.625000
vt 0.437500 0.875000
vt 0.187500 0.875000
vt 0.125000 0.625000
vt 0.062500 0.562500
vt 0.125000 0.562500
vt 0.125000 0.937500
vt 0.062500 0.875000
vt 0.125000 0.875000
vt 0.375000 0.000000
vt 0.250000 0.625000
vt 0.250000 0.000000
vt 0.375000 0.000000
vt 0.250000 0.625000
vt 0.250000 0.000000
vt 0.125000 1.000000
vt 0.250000 0.937500
vt 0.250000 1.000000
vt 0.187500 0.875000
vt 0.437500 0.625000
vt 0.437500 0.875000
vt 0.187500 0.625000
vt 0.187500 0.875000
vt 0.375000 0.625000
vt 0.500000 0.625000
vt 0.562500 0.562500
vt 0.500000 0.562500
vt 0.250000 0.625000
vt 0.437500 0.875000
vt 0.000000 0.625000
vt 0.062500 0.625000
vt 0.187500 0.875000
vt 0.437500 0.625000
vt 0.437500 0.875000
vt 0.562500 0.875000
vt 0.625000 0.625000
vt 0.562500 0.625000
vt 0.500000 0.937500
vt 0.500000 0.875000
vt 0.437500 0.562500
vt 0.500000 0.500000
vt 0.437500 0.500000
vt 0.250000 -0.000000
vt 0.125000 0.125000
vt 0.125000 -0.000000
vt 0.187500 0.625000
vt 0.437500 0.625000
vt 0.250000 0.687500
vt 0.375000 0.812500
vt 0.437500 0.812500
vt 0.437500 0.875000
vt 0.375000 0.500000
vt 0.437500 0.437500
vt 0.375000 0.437500
vt 0.500000 1.000000
vt 0.375000 0.937500
vt 0.375000 1.000000
vt 0.187500 0.625000
vt 0.062500 0.937500
vt 0.375000 0.625000
vt 0.187500 0.625000
vt 0.437500 0.625000
vt 0.187500 0.625000
vt 0.437500 0.625000
vt 0.000000 0.875000
vt 0.625000 0.875000
vt 0.562500 0.937500
vt 0.250000 0.125000
vt 0.250000 0.812500
vt 0.250000 0.875000
vt 0.187500 0.875000
vt 0.375000 0.687500
vt 0.333333 1.000000
vt 0.500000 -0.000000
vt 0.500000 1.000000
vt 0.666667 -0.000000
vt 0.166667 -0.000000
vt 0.166667 1.000000
vt 0.833333 -0.000000
vt 0.666667 1.000000
vt 0.666667 -0.000000
vt 0.000000 1.000000
vt 0.000000 -0.000000
vt 1.000000 -0.000000
vt 0.833333 1.000000
vt 0.833333 -0.000000
vt 0.333333 -0.000000
vt 0.666667 1.000000
vt 0.833333 1.000000
vt 1.000000 1.000000
vn 0.0000 -0.5000 0.8660
vn 0.0000 0.5000 -0.8660
vn 0.0000 0.8660 0.5000
vn 1.0000 0.0000 -0.0000
vn -1.0000 0.0000 0.0000
vn 0.0000 -0.8660 -0.5000
g everness_mineral_torch.vox_everness_mineral_torch.vox_torch
usemtl torch
s off
f 52/1/1 20/2/1 54/3/1
f 49/4/1 23/5/1 21/6/1
f 44/7/1 4/8/1 30/9/1
f 50/10/1 25/11/1 24/12/1
f 53/13/1 48/14/1 15/15/1
f 1/16/1 45/17/1 35/18/1
f 37/19/2 42/20/2 10/21/2
f 33/22/1 17/23/1 56/24/1
f 8/25/3 4/26/3 14/27/3
f 42/20/4 1/16/4 10/21/4
f 41/28/4 14/27/4 4/29/4
f 46/30/5 35/18/5 45/17/5
f 13/31/2 39/32/2 40/33/2
f 28/34/5 30/35/5 8/25/5
f 48/14/1 29/36/1 26/37/1
f 14/38/2 47/39/2 8/40/2
f 18/41/2 34/42/2 38/43/2
f 11/44/2 18/41/2 36/45/2
f 16/46/2 51/47/2 19/48/2
f 1/49/6 37/50/6 10/51/6
f 43/52/6 41/53/6 42/54/6
f 45/55/6 44/56/6 3/57/6
f 12/58/2 22/59/2 9/60/2
f 27/61/2 6/62/2 5/63/2
f 52/1/1 21/6/1 20/2/1
f 49/4/1 24/12/1 23/5/1
f 30/9/1 3/64/1 44/7/1
f 44/7/1 41/53/1 4/8/1
f 50/10/1 26/37/1 25/11/1
f 53/13/1 55/65/1 48/14/1
f 1/16/1 2/66/1 45/17/1
f 37/19/2 46/30/2 42/20/2
f 33/22/1 53/13/1 17/23/1
f 8/25/3 30/67/3 4/26/3
f 42/20/4 2/66/4 1/16/4
f 41/28/4 43/68/4 14/27/4
f 46/30/5 37/19/5 35/18/5
f 13/31/2 38/43/2 39/32/2
f 8/25/5 47/69/5 28/34/5
f 28/34/5 3/70/5 30/35/5
f 48/14/1 31/71/1 29/36/1
f 14/38/2 43/52/2 47/39/2
f 18/41/2 32/72/2 34/42/2
f 11/44/2 7/73/2 18/41/2
f 16/46/2 40/33/2 51/47/2
f 1/49/6 35/74/6 37/50/6
f 42/54/6 46/75/6 43/52/6
f 46/75/6 28/76/6 47/77/6
f 43/52/6 46/75/6 47/77/6
f 41/53/6 44/56/6 2/78/6
f 44/56/6 45/55/6 2/78/6
f 41/53/6 2/78/6 42/54/6
f 3/57/6 28/76/6 45/55/6
f 28/76/6 46/75/6 45/55/6
f 12/58/2 19/48/2 22/59/2
f 27/61/2 11/44/2 6/62/2
g everness_mineral_torch.vox_everness_mineral_torch.vox_particle_cube
usemtl particle_cube
f 60/79/2 64/80/2 61/81/2
f 63/82/5 61/81/5 64/80/5
f 58/83/4 60/79/4 62/84/4
f 61/85/3 62/86/3 60/87/3
f 58/83/1 59/88/1 63/89/1
f 58/90/6 64/91/6 57/92/6
f 60/79/2 57/93/2 64/80/2
f 63/82/5 59/94/5 61/81/5
f 58/83/4 57/93/4 60/79/4
f 61/85/3 59/95/3 62/86/3
f 58/83/1 62/84/1 59/88/1
f 58/90/6 63/96/6 64/91/6
@@ -0,0 +1,243 @@
# Blender v2.83.20 OBJ File: 'everness_mineral_torch.blend'
# www.blender.org
mtllib everness_mineral_torch_wall.mtl
o everness_mineral_torch.vox
v 0.062500 -0.594127 -0.408750
v 0.062500 -0.281627 0.132516
v -0.125000 -0.335753 0.163766
v 0.125000 -0.210753 0.380272
v 0.062500 -0.040000 0.426025
v 0.062500 -0.071250 0.371899
v 0.250000 -0.071250 0.371899
v -0.125000 0.005753 0.255272
v 0.062500 -0.321250 -0.061114
v 0.062500 -0.485873 -0.471250
v 0.187500 -0.071250 0.371899
v 0.062500 -0.290000 -0.006987
v 0.187500 -0.227500 0.101266
v 0.125000 0.005753 0.255272
v -0.187500 -0.102500 0.317772
v 0.125000 -0.258750 0.047139
v -0.062500 -0.071250 0.371899
v 0.250000 -0.102500 0.317772
v 0.125000 -0.290000 -0.006987
v -0.125000 -0.321250 -0.061114
v -0.125000 -0.290000 -0.006987
v 0.125000 -0.321250 -0.061114
v -0.187500 -0.290000 -0.006987
v -0.187500 -0.258750 0.047139
v -0.250000 -0.258750 0.047139
v -0.250000 -0.227500 0.101266
v 0.187500 -0.040000 0.426025
v -0.125000 -0.173373 0.070016
v -0.312500 -0.227500 0.101266
v -0.125000 -0.210753 0.380272
v -0.312500 -0.102500 0.317772
v 0.312500 -0.102500 0.317772
v -0.187500 -0.040000 0.426025
v 0.312500 -0.227500 0.101266
v -0.062500 -0.594127 -0.408750
v 0.187500 -0.102500 0.317772
v -0.062500 -0.485873 -0.471250
v 0.250000 -0.227500 0.101266
v 0.250000 -0.258750 0.047139
v 0.187500 -0.258750 0.047139
v 0.125000 -0.335753 0.163766
v 0.062500 -0.173373 0.070016
v 0.125000 -0.119247 0.038766
v -0.062500 -0.335753 0.163766
v -0.062500 -0.281627 0.132516
v -0.062500 -0.173373 0.070016
v -0.125000 -0.119247 0.038766
v -0.250000 -0.102500 0.317772
v -0.125000 -0.258750 0.047139
v -0.187500 -0.227500 0.101266
v 0.187500 -0.290000 -0.006987
v -0.062500 -0.290000 -0.006987
v -0.187500 -0.071250 0.371899
v -0.062500 -0.321250 -0.061114
v -0.250000 -0.071250 0.371899
v -0.062500 -0.040000 0.426025
v 0.187500 -0.088251 -0.051298
v 0.187500 -0.413011 0.136202
v -0.187500 -0.225511 0.460961
v 0.187500 0.099249 0.273461
v -0.187500 0.099249 0.273461
v 0.187500 -0.225511 0.460961
v -0.187500 -0.413011 0.136202
v -0.187500 -0.088251 -0.051298
vt 0.250000 0.500000
vt 0.187500 0.437500
vt 0.250000 0.437500
vt 0.187500 0.562500
vt 0.125000 0.500000
vt 0.187500 0.500000
vt 0.250000 0.625000
vt 0.437500 0.875000
vt 0.187500 0.875000
vt 0.125000 0.625000
vt 0.062500 0.562500
vt 0.125000 0.562500
vt 0.125000 0.937500
vt 0.062500 0.875000
vt 0.125000 0.875000
vt 0.375000 0.000000
vt 0.250000 0.625000
vt 0.250000 0.000000
vt 0.375000 0.000000
vt 0.250000 0.625000
vt 0.250000 0.000000
vt 0.125000 1.000000
vt 0.250000 0.937500
vt 0.250000 1.000000
vt 0.187500 0.875000
vt 0.437500 0.625000
vt 0.437500 0.875000
vt 0.187500 0.625000
vt 0.187500 0.875000
vt 0.375000 0.625000
vt 0.500000 0.625000
vt 0.562500 0.562500
vt 0.500000 0.562500
vt 0.250000 0.625000
vt 0.437500 0.875000
vt 0.000000 0.625000
vt 0.062500 0.625000
vt 0.187500 0.875000
vt 0.437500 0.625000
vt 0.437500 0.875000
vt 0.562500 0.875000
vt 0.625000 0.625000
vt 0.562500 0.625000
vt 0.500000 0.937500
vt 0.500000 0.875000
vt 0.437500 0.562500
vt 0.500000 0.500000
vt 0.437500 0.500000
vt 0.250000 -0.000000
vt 0.125000 0.125000
vt 0.125000 -0.000000
vt 0.187500 0.625000
vt 0.437500 0.625000
vt 0.250000 0.687500
vt 0.375000 0.812500
vt 0.437500 0.812500
vt 0.437500 0.875000
vt 0.375000 0.500000
vt 0.437500 0.437500
vt 0.375000 0.437500
vt 0.500000 1.000000
vt 0.375000 0.937500
vt 0.375000 1.000000
vt 0.187500 0.625000
vt 0.062500 0.937500
vt 0.375000 0.625000
vt 0.187500 0.625000
vt 0.437500 0.625000
vt 0.187500 0.625000
vt 0.437500 0.625000
vt 0.000000 0.875000
vt 0.625000 0.875000
vt 0.562500 0.937500
vt 0.250000 0.125000
vt 0.250000 0.812500
vt 0.250000 0.875000
vt 0.187500 0.875000
vt 0.375000 0.687500
vt 0.333333 1.000000
vt 0.500000 -0.000000
vt 0.500000 1.000000
vt 0.666667 -0.000000
vt 0.166667 -0.000000
vt 0.166667 1.000000
vt 0.833333 -0.000000
vt 0.666667 1.000000
vt 0.666667 -0.000000
vt 0.000000 1.000000
vt 0.000000 -0.000000
vt 1.000000 -0.000000
vt 0.833333 1.000000
vt 0.833333 -0.000000
vt 0.333333 -0.000000
vt 0.666667 1.000000
vt 0.833333 1.000000
vt 1.000000 1.000000
vn 0.0000 -0.8660 0.5000
vn 0.0000 0.8660 -0.5000
vn 0.0000 0.5000 0.8660
vn 1.0000 0.0000 -0.0000
vn -1.0000 0.0000 0.0000
vn 0.0000 -0.5000 -0.8660
g everness_mineral_torch.vox_everness_mineral_torch.vox_torch
usemtl torch
s off
f 52/1/1 20/2/1 54/3/1
f 49/4/1 23/5/1 21/6/1
f 44/7/1 4/8/1 30/9/1
f 50/10/1 25/11/1 24/12/1
f 53/13/1 48/14/1 15/15/1
f 1/16/1 45/17/1 35/18/1
f 37/19/2 42/20/2 10/21/2
f 33/22/1 17/23/1 56/24/1
f 8/25/3 4/26/3 14/27/3
f 42/20/4 1/16/4 10/21/4
f 41/28/4 14/27/4 4/29/4
f 46/30/5 35/18/5 45/17/5
f 13/31/2 39/32/2 40/33/2
f 28/34/5 30/35/5 8/25/5
f 48/14/1 29/36/1 26/37/1
f 14/38/2 47/39/2 8/40/2
f 18/41/2 34/42/2 38/43/2
f 11/44/2 18/41/2 36/45/2
f 16/46/2 51/47/2 19/48/2
f 1/49/6 37/50/6 10/51/6
f 43/52/6 41/53/6 42/54/6
f 45/55/6 44/56/6 3/57/6
f 12/58/2 22/59/2 9/60/2
f 27/61/2 6/62/2 5/63/2
f 52/1/1 21/6/1 20/2/1
f 49/4/1 24/12/1 23/5/1
f 30/9/1 3/64/1 44/7/1
f 44/7/1 41/53/1 4/8/1
f 50/10/1 26/37/1 25/11/1
f 53/13/1 55/65/1 48/14/1
f 1/16/1 2/66/1 45/17/1
f 37/19/2 46/30/2 42/20/2
f 33/22/1 53/13/1 17/23/1
f 8/25/3 30/67/3 4/26/3
f 42/20/4 2/66/4 1/16/4
f 41/28/4 43/68/4 14/27/4
f 46/30/5 37/19/5 35/18/5
f 13/31/2 38/43/2 39/32/2
f 8/25/5 47/69/5 28/34/5
f 28/34/5 3/70/5 30/35/5
f 48/14/1 31/71/1 29/36/1
f 14/38/2 43/52/2 47/39/2
f 18/41/2 32/72/2 34/42/2
f 11/44/2 7/73/2 18/41/2
f 16/46/2 40/33/2 51/47/2
f 1/49/6 35/74/6 37/50/6
f 42/54/6 46/75/6 43/52/6
f 46/75/6 28/76/6 47/77/6
f 43/52/6 46/75/6 47/77/6
f 41/53/6 44/56/6 2/78/6
f 44/56/6 45/55/6 2/78/6
f 41/53/6 2/78/6 42/54/6
f 3/57/6 28/76/6 45/55/6
f 28/76/6 46/75/6 45/55/6
f 12/58/2 19/48/2 22/59/2
f 27/61/2 11/44/2 6/62/2
g everness_mineral_torch.vox_everness_mineral_torch.vox_particle_cube
usemtl particle_cube
f 60/79/2 64/80/2 61/81/2
f 63/82/5 61/81/5 64/80/5
f 58/83/4 60/79/4 62/84/4
f 61/85/3 62/86/3 60/87/3
f 58/83/1 59/88/1 63/89/1
f 58/90/6 64/91/6 57/92/6
f 60/79/2 57/93/2 64/80/2
f 63/82/5 59/94/5 61/81/5
f 58/83/4 57/93/4 60/79/4
f 61/85/3 59/95/3 62/86/3
f 58/83/1 62/84/1 59/88/1
f 58/90/6 63/96/6 64/91/6
@@ -0,0 +1,170 @@
# Blender v2.83.20 OBJ File: 'everness_skull_with_candle.blend'
# www.blender.org
mtllib scull_with_candle.vox.mtl
o scull_with_candle.vox
v -0.225000 0.026000 0.225000
v -0.075000 0.026000 0.000000
v -0.075000 0.026000 0.075000
v 0.075000 0.551000 -0.075000
v -0.300000 -0.499000 0.300000
v 0.225000 -0.424000 0.225000
v -0.300000 0.101000 -0.300000
v 0.075000 0.026000 0.075000
v 0.075000 0.101000 0.075000
v -0.300000 0.101000 0.300000
v -0.075000 0.101000 -0.075000
v -0.300000 -0.499000 -0.300000
v 0.300000 0.101000 -0.300000
v -0.075000 0.101000 0.075000
v -0.075000 0.551000 -0.075000
v 0.300000 -0.499000 0.300000
v 0.225000 -0.424000 -0.225000
v 0.225000 0.026000 -0.225000
v -0.225000 0.026000 -0.225000
v 0.075000 0.026000 -0.075000
v 0.300000 0.101000 0.300000
v 0.075000 0.551000 0.075000
v 0.300000 -0.499000 -0.300000
v -0.075000 0.026000 -0.075000
v 0.225000 0.026000 0.225000
v -0.225000 -0.424000 -0.225000
v -0.225000 -0.424000 0.225000
v 0.075000 0.101000 -0.075000
v -0.075000 0.551000 0.075000
v 0.075000 0.551000 -0.000000
v -0.075000 0.551000 -0.000000
v 0.075000 0.701000 -0.000000
v -0.075000 0.701000 -0.000000
v -0.000000 0.551000 -0.075000
v -0.000000 0.701000 -0.075000
v 0.000000 0.551000 0.075000
v 0.000000 0.701000 0.075000
vt 0.866667 0.233333
vt 0.866667 0.033333
vt 0.800000 0.033333
vt 0.800000 0.233333
vt 0.466667 0.533333
vt 0.266667 0.533333
vt 0.333333 0.666667
vt 0.333333 0.600000
vt 0.400000 0.600000
vt 0.400000 0.633333
vt 0.533333 0.266667
vt 0.733333 0.266667
vt 0.733333 0.466667
vt 0.533333 0.466667
vt 0.600000 0.733333
vt 0.600000 0.800000
vt 0.533333 0.800000
vt 0.533333 0.733333
vt 0.000000 0.800000
vt 0.000000 0.533333
vt 0.266667 0.533333
vt 0.266667 0.800000
vt 0.533333 0.766667
vt 0.533333 0.966667
vt 0.466667 0.966667
vt 0.466667 0.766667
vt 0.533333 0.266667
vt 0.266667 0.266667
vt 0.266667 0.533333
vt 0.533333 0.533333
vt 0.466667 0.933333
vt 0.266667 0.933333
vt 0.266667 0.733333
vt 0.466667 0.733333
vt 0.666667 0.533333
vt 0.666667 0.733333
vt 0.866667 0.733333
vt 0.866667 0.533333
vt 0.266667 0.733333
vt 0.466667 0.733333
vt 0.400000 0.666667
vt 0.266667 0.266667
vt 0.266667 0.000000
vt 0.433333 0.100000
vt 0.366667 0.100000
vt 0.366667 0.166667
vt 0.433333 0.166667
vt 0.933333 0.566667
vt 0.866667 0.566667
vt 0.866667 0.766667
vt 0.933333 0.766667
vt 0.533333 0.000000
vt 0.533333 0.266667
vt 0.800000 0.266667
vt 0.800000 0.000000
vt 0.800000 0.000000
vt 0.866667 0.000000
vt 0.000000 0.266667
vt 0.000000 0.000000
vt 0.266667 0.000000
vt 0.266667 0.266667
vt 0.266667 0.266667
vt 0.000000 0.266667
vt 0.000000 0.533333
vt 0.266667 0.533333
vt 0.933333 0.033333
vt 0.933333 0.233333
vt 0.866667 0.233333
vt 0.866667 0.033333
vt 0.933333 0.533333
vt 0.866667 0.533333
vt 0.533333 0.000000
vt 0.533333 0.266667
vt 0.933333 0.000000
vt 0.900000 0.000000
vt 0.866667 0.000000
vt 0.533333 0.733333
vt 0.466667 0.733333
vt 0.733333 0.466667
vt 0.933333 0.466667
vt 0.933333 0.266667
vt 0.733333 0.266667
vt 0.466667 0.733333
vt 0.466667 0.533333
vt 0.666667 0.533333
vt 0.666667 0.733333
vt 0.866667 0.733333
vt 0.866667 1.000000
vt 0.600000 1.000000
vt 0.600000 0.733333
vt 0.866667 1.000000
vt 0.600000 1.000000
vt 0.600000 0.733333
vt 0.866667 0.733333
vn 0.0000 0.0000 1.0000
vn 0.0000 -1.0000 0.0000
vn 0.0000 1.0000 0.0000
vn -0.0000 0.0000 -1.0000
vn -1.0000 0.0000 0.0000
vn 1.0000 0.0000 -0.0000
usemtl scull_with_candle.vox_Material
s off
f 29/1/1 14/2/1 9/3/1 22/4/1
f 19/5/2 18/6/2 8/7/2 20/8/2 24/9/2 2/10/2
f 17/11/3 26/12/3 27/13/3 6/14/3
f 15/15/3 29/16/3 22/17/3 4/18/3
f 13/19/4 23/20/4 12/21/4 7/22/4
f 11/23/4 15/24/4 4/25/4 28/26/4
f 12/27/2 23/28/2 16/29/2 5/30/2
f 25/31/5 18/32/5 17/33/5 6/34/5
f 26/35/6 19/36/6 1/37/6 27/38/6
f 25/39/2 1/40/2 19/5/2 2/10/2 3/41/2 8/7/2 18/6/2
f 21/42/3 13/43/3 11/44/3 28/45/3 9/46/3 14/47/3
f 9/48/6 28/49/6 4/50/6 22/51/6
f 28/45/2 9/46/2 14/47/2 11/44/2
f 16/52/1 21/53/1 10/54/1 5/55/1
f 14/2/4 9/3/4 8/56/4 3/57/4
f 7/58/5 12/59/5 5/60/5 10/61/5
f 16/62/6 23/63/6 13/64/6 21/65/6
f 14/66/5 29/67/5 15/68/5 11/69/5
f 8/70/5 9/48/5 28/49/5 20/71/5
f 7/72/3 10/73/3 21/42/3 14/47/3 11/44/3 13/43/3
f 11/69/6 14/66/6 3/74/6 2/75/6 24/76/6
f 28/26/1 11/23/1 24/77/1 20/78/1
f 18/79/1 19/80/1 26/81/1 17/82/1
f 25/83/4 6/84/4 27/85/4 1/86/4
usemtl candle_fire.001
f 31/87/4 33/88/4 32/89/4 30/90/4
f 35/91/6 37/92/6 36/93/6 34/94/6
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,149 @@
# Blender v2.83.20 OBJ File: 'everness_venus_trap.blend'
# www.blender.org
mtllib everness_venus_trap.mtl
o Plane
v -0.625000 -0.499000 0.625000
v 0.625000 -0.499000 0.625000
v -0.625000 -0.499000 -0.625000
v 0.625000 -0.499000 -0.625000
v 0.000000 -0.499000 0.000000
v -0.625000 -0.405250 0.000000
v 0.000000 -0.405250 0.625000
v 0.625000 -0.405250 0.000000
v 0.000000 -0.405250 -0.625000
vt 0.875000 0.125000
vt 0.875000 0.312500
vt 0.687500 0.312500
vt 0.687500 0.125000
vt 0.875000 0.500000
vt 0.687500 0.500000
vt 0.500000 0.500000
vt 0.500000 0.312500
vt 0.500000 0.125000
vn -0.1467 0.9782 0.1467
vn 0.1467 0.9782 -0.1467
vn -0.1467 0.9782 -0.1467
vn 0.1467 0.9782 0.1467
usemtl flower
s off
f 2/1/1 8/2/1 5/3/1
f 7/4/2 2/1/2 5/3/2
f 8/2/3 4/5/3 5/3/3
f 9/6/1 3/7/1 5/3/1
f 6/8/4 1/9/4 5/3/4
f 3/7/2 6/8/2 5/3/2
f 4/5/4 9/6/4 5/3/4
f 1/9/3 7/4/3 5/3/3
o Cube_Cube.001
v 0.071372 -0.499000 0.442448
v -0.214282 0.200707 0.728103
v -0.442448 -0.499000 -0.071372
v -0.728103 0.200707 0.214282
v -0.674071 0.244824 0.160250
v -0.542565 0.352199 0.028744
v -0.160250 0.244824 0.674071
v -0.028744 0.352199 0.542565
v 0.125404 -0.454883 0.388416
v -0.388416 -0.454883 -0.125404
v -0.071372 -0.499000 -0.442448
v 0.214282 0.200707 -0.728103
v 0.442448 -0.499000 0.071372
v 0.728103 0.200707 -0.214282
v 0.674071 0.244824 -0.160250
v 0.542565 0.352199 -0.028744
v -0.256910 -0.347509 -0.256910
v 0.388416 -0.454883 0.125404
v 0.028744 0.352199 -0.542565
v 0.256910 -0.347509 0.256910
v 0.160250 0.244824 -0.674070
v -0.125404 -0.454883 -0.388416
vt 0.265625 0.187500
vt 0.265625 0.500000
vt 0.000000 0.500000
vt 0.000000 0.187500
vt 0.375000 0.687500
vt 0.375000 1.000000
vt 0.281250 1.000000
vt 0.281250 0.687500
vt 0.000000 0.890625
vt 0.000000 0.968750
vt 0.250000 0.968750
vt 0.250000 0.890625
vt 0.250000 1.000000
vt 0.250000 0.687500
vt 0.000000 1.000000
vt 0.281250 1.000000
vt 0.281250 0.687500
vt 0.375000 0.687500
vt 0.375000 1.000000
vt 0.765625 0.687500
vt 0.765625 1.000000
vt 0.500000 1.000000
vt 0.500000 0.687500
vt 0.000000 0.890625
vt 0.000000 0.859375
vt 0.250000 0.859375
vt 0.250000 0.890625
vt 0.250000 1.000000
vt 0.250000 0.687500
vt 0.000000 0.781250
vt 0.250000 0.781250
vt -0.000000 0.500000
vt -0.000000 0.187500
vt 0.265625 0.187500
vt 0.265625 0.500000
vt 0.375000 0.687500
vt 0.281250 0.687500
vt 0.281250 1.000000
vt 0.250000 0.890625
vt 0.250000 0.968750
vt 0.000000 0.968750
vt 0.000000 0.890625
vt 0.250000 0.687500
vt 0.250000 1.000000
vt 0.250000 1.000000
vt 0.000000 1.000000
vt 0.281250 0.687500
vt 0.281250 1.000000
vt 0.375000 1.000000
vt 0.765625 0.687500
vt 0.765625 1.000000
vt 0.500000 1.000000
vt 0.500000 0.687500
vt 0.000000 0.890625
vt 0.000000 0.859375
vt 0.250000 0.859375
vt 0.250000 0.890625
vt 0.250000 0.687500
vt 0.000000 0.781250
vt 0.250000 0.781250
vn -0.6124 -0.5000 0.6124
vn 0.7071 0.0000 0.7071
vn -0.3536 0.8660 0.3536
vn -0.7071 0.0000 -0.7071
vn 0.3536 -0.8660 -0.3536
vn 0.6124 -0.5000 -0.6124
vn 0.3536 0.8660 -0.3536
vn -0.3536 -0.8660 0.3536
usemtl flower
s off
f 10/10/5 11/11/5 13/12/5 12/13/5
f 29/14/6 17/15/6 16/16/6 18/17/6
f 15/18/7 14/19/7 16/20/7 17/21/7
f 18/17/6 16/16/6 11/22/6 10/23/6
f 14/19/7 13/24/7 11/22/7 16/20/7
f 19/25/8 14/26/8 15/27/8 26/28/8
f 18/29/5 16/30/5 14/31/5 19/32/5
f 12/33/9 19/34/9 18/35/9 10/36/9
f 12/37/8 13/38/8 14/26/8 19/25/8
f 19/34/9 26/39/9 29/40/9 18/35/9
f 20/41/10 21/42/10 23/43/10 22/44/10
f 26/28/8 28/45/8 30/46/8 31/47/8
f 25/48/11 24/49/11 30/50/11 28/51/11
f 31/47/8 30/46/8 21/52/8 20/53/8
f 24/49/11 23/54/11 21/55/11 30/50/11
f 27/56/6 24/57/6 25/58/6 29/14/6
f 31/59/10 30/60/10 24/61/10 27/62/10
f 22/63/12 27/64/12 31/65/12 20/66/12
f 22/67/6 23/54/6 24/57/6 27/56/6
f 27/64/12 29/68/12 26/69/12 31/65/12
+109
View File
@@ -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
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+545
View File
@@ -0,0 +1,545 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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 = core.get_translator(core.get_current_modname())
core.override_item('everness:coral_dirt', {
soil = {
base = 'everness:coral_dirt',
dry = 'everness:coral_dirt_soil',
wet = 'everness:coral_dirt_soil_wet'
}
})
core.override_item('everness:dirt_with_coral_grass', {
soil = {
base = 'everness:dirt_with_coral_grass',
dry = 'everness:coral_dirt_soil',
wet = 'everness:coral_dirt_soil_wet'
}
})
core.override_item('everness:dirt_1', {
soil = {
base = 'everness:dirt_1',
dry = 'everness:dirt_1_soil',
wet = 'everness:dirt_1_soil_wet'
}
})
core.override_item('everness:dirt_with_grass_1', {
soil = {
base = 'everness:dirt_with_grass_1',
dry = 'everness:dirt_1_soil',
wet = 'everness:dirt_1_soil_wet'
}
})
core.override_item('everness:dry_dirt', {
soil = {
base = 'everness:dry_dirt',
dry = 'everness:dry_dirt_soil',
wet = 'everness:dry_dirt_soil_wet'
}
})
core.override_item('everness:dry_dirt_with_dry_grass', {
soil = {
base = 'everness:dry_dirt_with_dry_grass',
dry = 'everness:dry_dirt_soil',
wet = 'everness:dry_dirt_soil_wet'
}
})
core.override_item('everness:dirt_with_grass_extras_1', {
soil = {
base = 'everness:dirt_with_grass_extras_1',
dry = 'everness:dirt_1_soil',
wet = 'everness:dirt_1_soil_wet'
}
})
core.override_item('everness:dirt_with_grass_extras_2', {
soil = {
base = 'everness:dirt_with_grass_extras_2',
dry = 'everness:dirt_1_soil',
wet = 'everness:dirt_1_soil_wet'
}
})
core.override_item('everness:crystal_dirt', {
soil = {
base = 'everness:crystal_dirt',
dry = 'everness:crystal_dirt_soil',
wet = 'everness:crystal_dirt_soil_wet'
}
})
core.override_item('everness:dirt_with_crystal_grass', {
soil = {
base = 'everness:dirt_with_crystal_grass',
dry = 'everness:crystal_dirt_soil',
wet = 'everness:crystal_dirt_soil_wet'
}
})
core.override_item('everness:crystal_cave_dirt', {
soil = {
base = 'everness:crystal_cave_dirt',
dry = 'everness:crystal_cave_dirt_soil',
wet = 'everness:crystal_cave_dirt_soil_wet'
}
})
core.override_item('everness:crystal_cave_dirt_with_moss', {
soil = {
base = 'everness:crystal_cave_dirt_with_moss',
dry = 'everness:crystal_cave_dirt_soil',
wet = 'everness:crystal_cave_dirt_soil_wet'
}
})
core.override_item('everness:cursed_dirt', {
soil = {
base = 'everness:cursed_dirt',
dry = 'everness:cursed_dirt_soil',
wet = 'everness:cursed_dirt_soil_wet'
}
})
core.override_item('everness:dirt_with_cursed_grass', {
soil = {
base = 'everness:dirt_with_cursed_grass',
dry = 'everness:cursed_dirt_soil',
wet = 'everness:cursed_dirt_soil_wet'
}
})
-- normal soil
Everness:register_node('everness:coral_dirt_soil', {
description = S('Coral Dirt Soil'),
tiles = {
'everness_coral_dirt.png^(everness_coral_dirt.png^[mask:everness_farming_soil_overlay.png^[multiply:#A05F3A80)',
'everness_coral_dirt.png'
},
drop = 'everness:coral_dirt',
groups = {
-- MTG
crumbly = 3,
not_in_creative_inventory = 1,
soil = 2,
grassland = 1,
field = 1,
-- MCL
handy = 1,
shovely = 1,
dirt = 1,
soil_sapling = 2,
soil_sugarcane = 1,
cultivatable = 2,
enderman_takable = 1,
building_block = 1,
},
_mcl_blast_resistance = 0.5,
_mcl_hardness = 0.5,
sounds = Everness.node_sound_dirt_defaults(),
soil = {
base = 'everness:coral_dirt',
dry = 'everness:coral_dirt_soil',
wet = 'everness:coral_dirt_soil_wet'
}
})
Everness:register_node('everness:dirt_1_soil', {
description = S('Dirt Soil'),
tiles = {
'everness_dirt.png^(everness_dirt.png^[mask:everness_farming_soil_overlay.png^[multiply:#51341E80)',
'everness_dirt.png'
},
drop = 'everness:dirt_1',
groups = {
-- MTG
crumbly = 3,
not_in_creative_inventory = 1,
soil = 2,
grassland = 1,
field = 1,
-- MCL
handy = 1,
shovely = 1,
dirt = 1,
soil_sapling = 2,
soil_sugarcane = 1,
cultivatable = 2,
enderman_takable = 1,
building_block = 1,
},
_mcl_blast_resistance = 0.5,
_mcl_hardness = 0.5,
sounds = Everness.node_sound_dirt_defaults(),
soil = {
base = 'everness:dirt_1',
dry = 'everness:dirt_1_soil',
wet = 'everness:dirt_1_soil_wet'
}
})
Everness:register_node('everness:crystal_dirt_soil', {
description = S('Crystal Dirt Soil'),
tiles = {
'everness_crystal_dirt.png^(everness_crystal_dirt.png^[mask:everness_farming_soil_overlay.png^[multiply:#75506980)',
'everness_crystal_dirt.png'
},
drop = 'everness:crystal_dirt',
groups = {
-- MTG
crumbly = 3,
not_in_creative_inventory = 1,
soil = 2,
grassland = 1,
field = 1,
-- MCL
handy = 1,
shovely = 1,
dirt = 1,
soil_sapling = 2,
soil_sugarcane = 1,
cultivatable = 2,
enderman_takable = 1,
building_block = 1,
},
_mcl_blast_resistance = 0.5,
_mcl_hardness = 0.5,
sounds = Everness.node_sound_dirt_defaults(),
soil = {
base = 'everness:crystal_dirt',
dry = 'everness:crystal_dirt_soil',
wet = 'everness:crystal_dirt_soil_wet'
}
})
Everness:register_node('everness:crystal_cave_dirt_soil', {
description = S('Crystal Cave Dirt Soil'),
tiles = {
'everness_crystal_cave_dirt.png^(everness_crystal_cave_dirt.png^[mask:everness_farming_soil_overlay.png^[multiply:#CCB17E80)',
'everness_crystal_cave_dirt.png'
},
drop = 'everness:crystal_cave_dirt',
groups = {
-- MTG
crumbly = 3,
not_in_creative_inventory = 1,
soil = 2,
grassland = 1,
field = 1,
-- MCL
handy = 1,
shovely = 1,
dirt = 1,
soil_sapling = 2,
soil_sugarcane = 1,
cultivatable = 2,
enderman_takable = 1,
building_block = 1,
},
_mcl_blast_resistance = 0.5,
_mcl_hardness = 0.5,
sounds = Everness.node_sound_dirt_defaults(),
soil = {
base = 'everness:crystal_cave_dirt',
dry = 'everness:crystal_cave_dirt_soil',
wet = 'everness:crystal_cave_dirt_soil_wet'
}
})
Everness:register_node('everness:cursed_dirt_soil', {
description = S('Cursed Dirt Soil'),
tiles = {
'everness_cursed_dirt.png^(everness_cursed_dirt.png^[mask:everness_farming_soil_overlay.png^[multiply:#625B4B80)',
'everness_cursed_dirt.png'
},
drop = 'everness:cursed_dirt',
groups = {
-- MTG
crumbly = 3,
not_in_creative_inventory = 1,
soil = 2,
grassland = 1,
field = 1,
-- MCL
handy = 1,
shovely = 1,
dirt = 1,
soil_sapling = 2,
soil_sugarcane = 1,
cultivatable = 2,
enderman_takable = 1,
building_block = 1,
},
_mcl_blast_resistance = 0.5,
_mcl_hardness = 0.5,
sounds = Everness.node_sound_dirt_defaults(),
soil = {
base = 'everness:cursed_dirt',
dry = 'everness:cursed_dirt_soil',
wet = 'everness:cursed_dirt_soil_wet'
}
})
Everness:register_node('everness:dry_dirt_soil', {
description = S('Dry Dirt Soil'),
tiles = {
'everness_dry_dirt.png^(everness_dry_dirt.png^[mask:everness_farming_soil_overlay.png^[multiply:#9F754780)',
'everness_dry_dirt.png'
},
drop = 'everness:dry_dirt',
groups = {
-- MTG
crumbly = 3,
not_in_creative_inventory = 1,
soil = 2,
grassland = 1,
field = 1,
-- MCL
handy = 1,
shovely = 1,
dirt = 1,
soil_sapling = 2,
soil_sugarcane = 1,
cultivatable = 2,
enderman_takable = 1,
building_block = 1,
},
_mcl_blast_resistance = 0.5,
_mcl_hardness = 0.5,
sounds = Everness.node_sound_dirt_defaults(),
soil = {
base = 'everness:dry_dirt',
dry = 'everness:dry_dirt_soil',
wet = 'everness:dry_dirt_soil_wet'
}
})
-- wet soil
Everness:register_node('everness:coral_dirt_soil_wet', {
description = S('Coral Dirt Wet Soil'),
tiles = {
'everness_coral_dirt.png^(everness_coral_dirt.png^[mask:everness_farming_soil_wet_overlay.png^[multiply:#A05F3A80)',
'everness_coral_dirt.png^(everness_coral_dirt.png^[mask:everness_farming_soil_wet_side_overlay.png^[multiply:#A05F3A80)',
},
drop = 'everness:coral_dirt',
groups = {
-- MTG
crumbly = 3,
not_in_creative_inventory = 1,
soil = 3,
wet = 1,
grassland = 1,
field = 1,
-- MCL
handy = 1,
shovely = 1,
dirt = 1,
soil_sapling = 2,
soil_sugarcane = 1,
cultivatable = 2,
enderman_takable = 1,
building_block = 1,
},
_mcl_blast_resistance = 0.5,
_mcl_hardness = 0.5,
sounds = Everness.node_sound_dirt_defaults(),
soil = {
base = 'everness:coral_dirt',
dry = 'everness:coral_dirt_soil',
wet = 'everness:coral_dirt_soil_wet'
}
})
Everness:register_node('everness:dirt_1_soil_wet', {
description = S('Coral Dirt Wet Soil'),
tiles = {
'everness_dirt.png^(everness_dirt.png^[mask:everness_farming_soil_wet_overlay.png^[multiply:#51341E80)',
'everness_dirt.png^(everness_dirt.png^[mask:everness_farming_soil_wet_side_overlay.png^[multiply:#51341E80)',
},
drop = 'everness:dirt_1',
groups = {
-- MTG
crumbly = 3,
not_in_creative_inventory = 1,
soil = 3,
wet = 1,
grassland = 1,
field = 1,
-- MCL
handy = 1,
shovely = 1,
dirt = 1,
soil_sapling = 2,
soil_sugarcane = 1,
cultivatable = 2,
enderman_takable = 1,
building_block = 1,
},
_mcl_blast_resistance = 0.5,
_mcl_hardness = 0.5,
sounds = Everness.node_sound_dirt_defaults(),
soil = {
base = 'everness:dirt_1',
dry = 'everness:dirt_1_soil',
wet = 'everness:dirt_1_soil_wet'
}
})
Everness:register_node('everness:crystal_dirt_soil_wet', {
description = S('Crystal Dirt Wet Soil'),
tiles = {
'everness_crystal_dirt.png^(everness_crystal_dirt.png^[mask:everness_farming_soil_wet_overlay.png^[multiply:#75506980)',
'everness_crystal_dirt.png^(everness_crystal_dirt.png^[mask:everness_farming_soil_wet_side_overlay.png^[multiply:#75506980)',
},
drop = 'everness:crystal_dirt',
groups = {
-- MTG
crumbly = 3,
not_in_creative_inventory = 1,
soil = 3,
wet = 1,
grassland = 1,
field = 1,
-- MCL
handy = 1,
shovely = 1,
dirt = 1,
soil_sapling = 2,
soil_sugarcane = 1,
cultivatable = 2,
enderman_takable = 1,
building_block = 1,
},
_mcl_blast_resistance = 0.5,
_mcl_hardness = 0.5,
sounds = Everness.node_sound_dirt_defaults(),
soil = {
base = 'everness:crystal_dirt',
dry = 'everness:crystal_dirt_soil',
wet = 'everness:crystal_dirt_soil_wet'
}
})
Everness:register_node('everness:crystal_cave_dirt_soil_wet', {
description = S('Crystal Cave Dirt Wet Soil'),
tiles = {
'everness_crystal_cave_dirt.png^(everness_crystal_cave_dirt.png^[mask:everness_farming_soil_wet_overlay.png^[multiply:#CCB17E80)',
'everness_crystal_cave_dirt.png^(everness_crystal_cave_dirt.png^[mask:everness_farming_soil_wet_side_overlay.png^[multiply:#CCB17E80)',
},
drop = 'everness:crystal_cave_dirt',
groups = {
-- MTG
crumbly = 3,
not_in_creative_inventory = 1,
soil = 3,
wet = 1,
grassland = 1,
field = 1,
-- MCL
handy = 1,
shovely = 1,
dirt = 1,
soil_sapling = 2,
soil_sugarcane = 1,
cultivatable = 2,
enderman_takable = 1,
building_block = 1,
},
_mcl_blast_resistance = 0.5,
_mcl_hardness = 0.5,
sounds = Everness.node_sound_dirt_defaults(),
soil = {
base = 'everness:crystal_cave_dirt',
dry = 'everness:crystal_cave_dirt_soil',
wet = 'everness:crystal_cave_dirt_soil_wet'
}
})
Everness:register_node('everness:cursed_dirt_soil_wet', {
description = S('Cursed Dirt Wet Soil'),
tiles = {
'everness_cursed_dirt.png^(everness_cursed_dirt.png^[mask:everness_farming_soil_wet_overlay.png^[multiply:#625B4B80)',
'everness_cursed_dirt.png^(everness_cursed_dirt.png^[mask:everness_farming_soil_wet_side_overlay.png^[multiply:#625B4B80)',
},
drop = 'everness:cursed_dirt',
groups = {
-- MTG
crumbly = 3,
not_in_creative_inventory = 1,
soil = 3,
wet = 1,
grassland = 1,
field = 1,
-- MCL
handy = 1,
shovely = 1,
dirt = 1,
soil_sapling = 2,
soil_sugarcane = 1,
cultivatable = 2,
enderman_takable = 1,
building_block = 1,
},
_mcl_blast_resistance = 0.5,
_mcl_hardness = 0.5,
sounds = Everness.node_sound_dirt_defaults(),
soil = {
base = 'everness:cursed_dirt',
dry = 'everness:cursed_dirt_soil',
wet = 'everness:cursed_dirt_soil_wet'
}
})
Everness:register_node('everness:dry_dirt_soil_wet', {
description = S('Cursed Dirt Wet Soil'),
tiles = {
'everness_dry_dirt.png^(everness_dry_dirt.png^[mask:everness_farming_soil_wet_overlay.png^[multiply:#9F754780)',
'everness_dry_dirt.png^(everness_dry_dirt.png^[mask:everness_farming_soil_wet_side_overlay.png^[multiply:#9F754780)',
},
drop = 'everness:dry_dirt',
groups = {
-- MTG
crumbly = 3,
not_in_creative_inventory = 1,
soil = 3,
wet = 1,
grassland = 1,
field = 1,
-- MCL
handy = 1,
shovely = 1,
dirt = 1,
soil_sapling = 2,
soil_sugarcane = 1,
cultivatable = 2,
enderman_takable = 1,
building_block = 1,
},
_mcl_blast_resistance = 0.5,
_mcl_hardness = 0.5,
sounds = Everness.node_sound_dirt_defaults(),
soil = {
base = 'everness:dry_dirt',
dry = 'everness:dry_dirt_soil',
wet = 'everness:dry_dirt_soil_wet'
}
})
@@ -0,0 +1,685 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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 = core.get_translator(core.get_current_modname())
Everness:register_node('everness:mineral_cave_stone', {
description = S('Mineral Cave Stone'),
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
}
},
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
},
{
name = 'everness_mineral_lava_stone_side.png',
align_style = 'world',
scale = 2
}
},
drop = 'everness:mineral_lava_stone_dry',
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,
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(),
})
Everness:register_node('everness:mineral_lava_stone_with_moss', {
description = S('Mineral Lava Stone with moss'),
is_ground_content = false,
-- Textures of node; +Y, -Y, +X, -X, +Z, -Z
tiles = {
{
name = 'everness_mineral_cave_moss.png',
align_style = 'world',
scale = 2
},
{
name = 'everness_mineral_cave_moss.png',
align_style = 'world',
scale = 2
},
{
name = 'everness_mineral_cave_moss_side.png',
align_style = 'world',
scale = 2
},
},
drop = 'everness:mineral_lava_stone_dry',
groups = {
-- MTG
cracky = 3,
-- Everness
everness_spreading_dirt_type_under = 1,
-- 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,
light_source = 3,
sounds = Everness.node_sound_stone_defaults(),
})
for i = 1, 7 do
local last = i == 7
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
},
},
move_resistance = last and 7 or 0,
damage_per_second = last and 4 or 0,
drowning = last and 1 or 0,
walkable = not last,
climbable = last,
})
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
},
},
move_resistance = last and 7 or 0,
damage_per_second = last and 4 or 0,
drowning = last and 1 or 0,
walkable = not last,
climbable = last,
})
Everness:register_node('everness:mineral_lava_stone_spike_' .. i, {
description = S('Mineral Lava Stone Spike') .. ' ' .. i,
-- 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,
},
},
},
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
},
},
light_source = 12,
move_resistance = last and 7 or 0,
damage_per_second = last and 4 or 0,
drowning = last and 1 or 0,
walkable = not last,
climbable = last,
})
end
Everness:register_node('everness:lava_tree', {
description = S('Lava Tree Trunk'),
short_description = S('Lava Tree Trunk'),
tiles = {
{ name = 'everness_lava_tree_top.png' },
{ name = 'everness_lava_tree_top.png' },
{
name = 'everness_lava_tree.png',
align_style = 'world',
scale = 2,
},
},
paramtype2 = 'facedir',
is_ground_content = false,
groups = {
-- MTG
choppy = 2,
oddly_breakable_by_hand = 1,
-- MCL
handy = 1,
axey = 1,
building_block = 1,
material_wood = 1,
fire_encouragement = 5,
fire_flammability = 5,
-- ALL
tree = 1,
flammable = 2,
},
_mcl_blast_resistance = 2,
_mcl_hardness = 2,
sounds = Everness.node_sound_wood_defaults(),
on_place = core.rotate_node
})
Everness:register_node('everness:lava_tree_with_lava', {
description = S('Lava Tree Trunk with Lava Veins'),
short_description = S('Lava Tree Trunk with Lava Veins'),
tiles = {
{ name = 'everness_lava_tree_top.png' },
{ name = 'everness_lava_tree_top.png' },
{
name = 'everness_lava_tree_animated.png',
align_style = 'world',
scale = 8,
animation = {
type = 'vertical_frames',
aspect_w = 16,
aspect_h = 16,
length = 8,
},
},
},
paramtype2 = 'facedir',
is_ground_content = false,
groups = {
-- MTG
choppy = 2,
oddly_breakable_by_hand = 1,
-- MCL
handy = 1,
axey = 1,
building_block = 1,
material_wood = 1,
fire_encouragement = 5,
fire_flammability = 5,
-- ALL
tree = 1,
flammable = 2,
},
_mcl_blast_resistance = 2,
_mcl_hardness = 2,
sounds = Everness.node_sound_wood_defaults(),
on_place = core.rotate_node,
light_source = 3,
})
Everness:register_node('everness:lava_tree_wood', {
description = S('Lava Tree Wood Planks'),
paramtype2 = 'facedir',
place_param2 = 0,
tiles = {
{
name = 'everness_lava_tree_wood.png',
align_style = 'world',
scale = 2
},
},
is_ground_content = false,
groups = {
-- MTG
choppy = 3,
oddly_breakable_by_hand = 2,
-- Everness
everness_wood = 1,
-- MCL
handy = 1,
axey = 1,
building_block = 1,
material_wood = 1,
fire_encouragement = 5,
fire_flammability = 20,
-- ALL
flammable = 3,
wood = 1,
},
_mcl_blast_resistance = 3,
_mcl_hardness = 2,
sounds = Everness.node_sound_wood_defaults(),
})
Everness:register_node('everness:lava_tree_sapling', {
description = S('Lava') .. ' ' .. S('Tree') .. ' ' .. S('Sapling'),
short_description = S('Lava') .. ' ' .. S('Tree') .. ' ' .. S('Sapling'),
drawtype = 'plantlike',
tiles = { 'everness_lava_tree_sapling.png' },
inventory_image = 'everness_lava_tree_sapling.png',
wield_image = 'everness_lava_tree_sapling.png',
paramtype = 'light',
sunlight_propagates = true,
walkable = false,
selection_box = {
type = 'fixed',
fixed = { -4 / 16, -0.5, -4 / 16, 4 / 16, 4 / 16, 4 / 16 }
},
groups = {
-- MTG
snappy = 2,
flammable = 2,
-- X Farming
compost = 30,
-- MCL
plant = 1,
non_mycelium_plant = 1,
deco_block = 1,
dig_by_water = 1,
dig_by_piston = 1,
destroy_by_lava_flow = 1,
compostability = 30,
-- ALL
dig_immediate = 3,
attached_node = 1,
sapling = 1,
},
_mcl_blast_resistance = 0,
_mcl_hardness = 0,
sounds = Everness.node_sound_leaves_defaults(),
on_timer = function(pos)
Everness.grow_sapling(pos)
end,
on_construct = function(pos)
core.get_node_timer(pos):start(math.random(300, 1500))
end,
on_place = function(itemstack, placer, pointed_thing)
local on_place_props = {
sapling_name = 'everness:lava_tree_sapling',
minp_relative = { x = -7, y = 1, z = -7 },
maxp_relative = { x = 7, y = 13, z = 7 },
interval = 4,
}
return Everness:sapling_on_place(itemstack, placer, pointed_thing, on_place_props)
end,
})
Everness:register_node('everness:lava_tree_leaves', {
description = S('Lava') .. ' ' .. S('Tree') .. ' ' .. S('Leaves'),
short_description = S('Lava') .. ' ' .. S('Tree') .. ' ' .. S('Leaves'),
drawtype = 'allfaces_optional',
tiles = {
{
name = 'everness_lava_tree_leaves.png',
align_style = 'world',
scale = 2,
},
},
special_tiles = {
{
name = 'everness_lava_tree_leaves.png',
align_style = 'world',
scale = 2,
},
},
paramtype = 'light',
is_ground_content = false,
sunlight_propagates = true,
groups = {
-- MTG
snappy = 3,
leafdecay = 3,
-- X Farming
compost = 30,
-- MCL
handy = 1,
hoey = 1,
shearsy = 1,
swordy = 1,
dig_by_piston = 1,
fire_encouragement = 30,
fire_flammability = 60,
deco_block = 1,
compostability = 30,
-- ALL
flammable = 2,
leaves = 1,
},
_mcl_shears_drop = true,
_mcl_blast_resistance = 0.2,
_mcl_hardness = 0.2,
_mcl_silk_touch_drop = true,
drop = {
max_items = 1,
items = {
{
-- player will get sapling with 1/100 chance
items = { 'everness:lava_tree_sapling' },
rarity = 100,
},
{
-- player will get leaves only if he get no saplings,
-- this is because max_items is 1
items = { 'everness:lava_tree_leaves' },
}
}
},
sounds = Everness.node_sound_leaves_defaults(),
after_place_node = function(pos, placer, itemstack, pointed_thing)
return Everness:after_place_leaves(pos, placer, itemstack, pointed_thing)
end
})
Everness:register_node('everness:mineral_cave_moss_grass', {
description = S('Mineral Cave Moss Grass'),
short_description = S('Mineral Cave Moss Grass'),
drawtype = 'plantlike',
waving = 1,
tiles = { 'everness_mineral_cave_moss_grass.png' },
inventory_image = 'everness_mineral_cave_moss_grass.png',
wield_image = 'everness_mineral_cave_moss_grass.png',
paramtype = 'light',
sunlight_propagates = true,
walkable = false,
buildable_to = true,
groups = {
-- MTG
snappy = 3,
flora = 1,
-- Everness
mineral_waters_grass_under = 1,
-- X Farming
compost = 30,
-- MCL
handy = 1,
shearsy = 1,
deco_block = 1,
plant = 1,
non_mycelium_plant = 1,
fire_encouragement = 60,
fire_flammability = 100,
dig_by_water = 1,
destroy_by_lava_flow = 1,
compostability = 30,
-- ALL
attached_node = 1,
flammable = 2,
},
_mcl_blast_resistance = 0,
_mcl_hardness = 0,
sounds = Everness.node_sound_leaves_defaults(),
selection_box = {
type = 'fixed',
fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, 4 / 16, 6 / 16 },
},
light_source = 7
})
+105
View File
@@ -0,0 +1,105 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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 = core.get_translator(core.get_current_modname())
xpanes.register_pane('pyrite_pane', {
description = S('Pyrite Glass Pane'),
textures = { 'everness_pyrite_glass.png', '', 'everness_xpanes_edge_pyrite.png' },
use_texture_alpha = 'clip',
inventory_image = 'everness_pyrite_glass.png',
wield_image = 'everness_pyrite_glass.png',
sounds = Everness.node_sound_glass_defaults(),
groups = { snappy = 2, cracky = 3, oddly_breakable_by_hand = 3 },
recipe = {
{ 'everness:pyrite_glass', 'everness:pyrite_glass', 'everness:pyrite_glass' },
{ 'everness:pyrite_glass', 'everness:pyrite_glass', 'everness:pyrite_glass' }
}
})
xpanes.register_pane('cursed_bar', {
description = S('Cursed Steel Bars'),
textures = {'everness_cursed_bar.png', '', 'everness_cursed_bar_top.png'},
inventory_image = 'everness_cursed_bar.png',
wield_image = 'everness_cursed_bar.png',
groups = { cracky = 2 },
sounds = Everness.node_sound_metal_defaults(),
recipe = {
{ 'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot' },
{ 'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot' },
{ 'everness:cursed_lands_deep_ocean_sandstone_block', 'everness:cursed_lands_deep_ocean_sandstone_block', 'everness:cursed_lands_deep_ocean_sandstone_block' }
}
})
-- Register steel bar doors and trapdoors
if core.get_modpath('doors') or core.global_exists('doors') then
doors.register('everness:door_cursed_steel_bar', {
tiles = {
{
name = 'everness_door_cursed_steel_bar.png',
backface_culling = true
}
},
description = S('Cursed Steel Bar Door'),
inventory_image = 'everness_door_cursed_steel_bar_item.png',
protected = true,
groups = {
node = 1,
cracky = 1,
level = 2
},
sounds = Everness.node_sound_metal_defaults(),
sound_open = 'xpanes_steel_bar_door_open',
sound_close = 'xpanes_steel_bar_door_close',
gain_open = 0.15,
gain_close = 0.13,
recipe = {
{'xpanes:cursed_bar_flat', 'xpanes:cursed_bar_flat'},
{'xpanes:cursed_bar_flat', 'xpanes:cursed_bar_flat'},
{'xpanes:cursed_bar_flat', 'xpanes:cursed_bar_flat'},
},
})
doors.register_trapdoor('everness:trapdoor_cursed_steel_bar', {
description = S('Steel Bar Trapdoor'),
inventory_image = 'everness_trapdoor_cursed_steel_bar.png',
wield_image = 'everness_trapdoor_cursed_steel_bar.png',
tile_front = 'everness_trapdoor_cursed_steel_bar.png',
tile_side = 'everness_trapdoor_cursed_steel_bar_side.png',
protected = true,
groups = {
node = 1,
cracky = 1,
level = 2,
door = 1
},
sounds = Everness.node_sound_metal_defaults(),
sound_open = 'xpanes_steel_bar_door_open',
sound_close = 'xpanes_steel_bar_door_close',
gain_open = 0.15,
gain_close = 0.13,
})
core.register_craft({
output = 'everness:trapdoor_cursed_steel_bar',
recipe = {
{'xpanes:cursed_bar_flat', 'xpanes:cursed_bar_flat'},
{'xpanes:cursed_bar_flat', 'xpanes:cursed_bar_flat'},
}
})
end
+85
View File
@@ -0,0 +1,85 @@
--[[
Everness. Never ending discovery in Everness mapgen.
Copyright (C) 2025 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 function update_sfinv(name)
core.after(0, function()
local player = core.get_player_by_name(name)
if player then
if sfinv.get_page(player) == 'everness:encyclopedia' then
sfinv.set_page(player, sfinv.get_homepage_name(player))
else
sfinv.set_player_inventory_formspec(player)
end
end
end)
end
local function update_ui(name)
core.after(0, function()
local player = core.get_player_by_name(name)
if player then
if unified_inventory.current_page[name] == 'everness:encyclopedia' then
unified_inventory.current_page[name] = 'craft'
end
unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[name])
end
end)
end
core.register_privilege('everness_encyclopedia', {
-- Privilege description
description = 'Collection of registered items and functions with some information about them. Used for testing not for gameplay. Works only with SFINV!',
-- Whether to grant the privilege to singleplayer.
give_to_singleplayer = false,
-- Whether to grant the privilege to the server admin.
-- Uses value of 'give_to_singleplayer' by default.
give_to_admin = false,
-- Called when given to player 'name' by 'granter_name'.
-- 'granter_name' will be nil if the priv was granted by a mod.
on_grant = function(name, granter_name)
if core.get_modpath('sfinv') and sfinv.enabled then
update_sfinv(name)
elseif core.get_modpath('unified_inventory') then
update_ui(name)
else
core.chat_send_player(name, 'Compatible inventory not found. Everness encyclopedia will not be shown.')
end
end,
-- Called when taken from player 'name' by 'revoker_name'.
-- 'revoker_name' will be nil if the priv was revoked by a mod.
-- Note that the above two callbacks will be called twice if a player is
-- responsible, once with the player name, and then with a nil player
-- name.
-- Return true in the above callbacks to stop register_on_priv_grant or
-- revoke being called.
on_revoke = function(name, revoker_name)
if core.get_modpath('sfinv') and sfinv.enabled then
update_sfinv(name)
elseif core.get_modpath('unified_inventory') then
update_ui(name)
else
core.chat_send_player(name, 'Compatible inventory not found. Everness encyclopedia will not be shown.')
end
end,
})
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loaded 100 of 1742 files, more files were not shown because too many files have changed in this diff. Show more