Compare commits

..

16 Commits
v3.3 ... master

Author SHA1 Message Date
Treer
b51b831483
Remove technic (fix issue #77) (#78)
nether added technic support on April 29, and technic added nether support on May 1, resulting in them both optionally depending on each other and becoming incompatible with each other.

To resolve this, technic will keep the nether support, the compressor recipe has been moved into technic (https://github.com/minetest-mods/technic/pull/644), and this commit reverts the technic-related parts of a6d1f55f, removing the technic dependency.
2024-07-16 21:21:15 +02:00
Mikita Wiśniewski
01b6f3c56d
No wear out in creative and replace add_wear with add_wear_by_uses (#76) 2024-05-20 20:22:39 +02:00
Diablosxm
a6d1f55f0a
Technic and Toolranks support (#73)
Co-authored-by: Treer <treer.git@gmail.com>
2024-04-28 18:53:46 +02:00
Jacob Lifshay
d16b530685
Call old on_place when not clicking on portal material (#74)
This is needed to work with telemosaic since telemosaic depends on `on_rightclick` being called on beacon node when wielding a mese crystal fragment.
2024-03-09 19:29:03 +01:00
Treer
ea677c5a1b
Hide unknown nodes under the nether bug (#72)
Hides bug #51 - the node_stone of the biome appears in the whole chunk under the Nether, so make nether:native_mapgen look the same as default:stone, and drop whatever default:stone drops
2023-05-06 14:44:54 +02:00
Treer
21c7e2801d restore string key in template
903025e accidently dropped a .
2023-04-16 01:38:43 +10:00
JoeEnderman
3470b1e22e add some French translations
I Hope all of the formatting is the same. I did check it multiple times.
2023-04-16 01:38:43 +10:00
Treer
3e809a811b
Merge pull request #65 from Treer/feature/fix-netherrack-slab-upstream
Update localization files
2023-04-15 12:51:51 +10:00
Treer
6c6a182366 Update localization files 2023-04-15 12:43:56 +10:00
JoeEnderman
9c1fa2c843
A fix for Netherrack slab being called Deep Netherrack slab (#63)
* fix netherrack slab being called Deep Netherrack
* Fix several lowercase block names

Several slabs and stairs were incorrectly named.
2023-04-15 12:34:20 +10:00
Treer
957fdc887b
Add giant crystal geodes (#35) 2023-01-26 15:59:05 +01:00
Treer
7dc32f6bb8
fix the sky in the nether caverns when using climate_api (#61)
The mantle and geode skys were working correctly, but not the sky in the main nether area - it would always switch back to stars.
Issue was found by process of elimination, so I don't know why climate_api doesn't accept "nether:nether" as a unique weather name identifier, or how this issue wasn't noticed earlier (did something change?).

climate_api's api_doc.md file says the name "should be prefixed with the mod's name in a way that could look like ``mymod:awesome_weather``. This name should only be used once."

so perhaps names of the form "mymod:mymod" cause issues? (I don't plan on figuring this climate_api behavior out though)
2022-11-20 01:05:03 +11:00
fluxionary
a8a6bb00c5
fumaroles: don't extinguish fires outside of the nether (#60)
thanks
2022-11-14 00:55:49 +11:00
fluxionary
12ca98c25a
Add gravel sounds to lava crust (#58) 2022-11-12 22:30:31 +11:00
Treer
a03375c5a4
Use Minetest_game fences API if it's available (#57)
Fixes #56, and adds netherbrick rails (for consistency with MTG) if the fences API is found.
Using the MTG fence system adds interop between different fence types, and support for the "Tall fences and walls" option.

I've left the nether's register_craft() call unchanged, it overrides the recipe that default.register_fence() registers, granting 6 fences per crafting instead of MTG's 4.
2022-09-11 14:51:23 +02:00
Treer
d3f79e961b Update locale templates 2022-02-13 14:14:03 +11:00
15 changed files with 485 additions and 98 deletions

View File

@ -27,8 +27,11 @@ read_globals = {
"stairsplus", "stairsplus",
"string.split", "string.split",
table = { fields = { "copy", "getn" } }, table = { fields = { "copy", "getn" } },
"toolranks",
"vector", "vector",
"VoxelArea", "VoxelArea",
"VoxelManip", "VoxelManip",
"walls",
xpanes = { fields = { "register_pane" } },
} }

View File

@ -26,7 +26,7 @@ the nether first, or basalt might be a crafting ingredient required to reach
a particular branch of the tech-tree. a particular branch of the tech-tree.
Netherbrick tools are provided (pick, shovel, axe, & sword), see tools.lua Netherbrick tools are provided (pick, shovel, axe, & sword), see tools.lua
The Nether pickaxe has a 10x bonus again wear when mining netherrack. The Nether pickaxe has a 10x bonus against wear when mining netherrack.
## License of source code: ## License of source code:
@ -65,6 +65,8 @@ SOFTWARE.
* `nether_book_`* (files starting with "nether_book"): Treer, 2019-2020 * `nether_book_`* (files starting with "nether_book"): Treer, 2019-2020
* `nether_brick_deep.png`: Treer, 2021 * `nether_brick_deep.png`: Treer, 2021
* `nether_fumarole.ogg`: Treer, 2020 * `nether_fumarole.ogg`: Treer, 2020
* `nether_geode.png`: Treer, 2021
* `nether_geode_glass.png`: Treer, 2021
* `nether_lava_bubble`* (files starting with "nether_lava_bubble"): Treer, 2020 * `nether_lava_bubble`* (files starting with "nether_lava_bubble"): Treer, 2020
* `nether_lava_crust_animated.png`: Treer, 2019-2020 * `nether_lava_crust_animated.png`: Treer, 2019-2020
* `nether_lightstaff.png`: Treer, 2021 * `nether_lightstaff.png`: Treer, 2021

View File

@ -7,3 +7,4 @@ loot?
mesecons? mesecons?
moreblocks? moreblocks?
climate_api? climate_api?
xpanes?

View File

@ -312,7 +312,7 @@ The expedition parties have found no diamonds or gold, and after an experienced
geodeSky.sky_data.base_color = nether.fogColor.geodes geodeSky.sky_data.base_color = nether.fogColor.geodes
climate_api.register_weather( climate_api.register_weather(
"nether:nether", "nether:caverns",
{ nether_biome = "nether" }, { nether_biome = "nether" },
{ ["climate_api:skybox"] = netherSky } { ["climate_api:skybox"] = netherSky }
) )

View File

@ -1,6 +1,6 @@
# textdomain: nether # textdomain: nether
# Translation FR by Louis Royer # Translation FR by Louis Royer and JoeEnderman
### init.lua ### ### init.lua ###
@ -15,57 +15,76 @@ Nether Portal=Portail du Nether
### mapgen_mantle.lua ### ### mapgen_mantle.lua ###
, @1m above lava-sea level= , @1m above lava-sea level=, @1m au-dessus du niveau de la mer de lave
, @1m below lava-sea level= , @1m below lava-sea level=, @1m en-dessous du niveau de la mer de lave
, approaching y boundary of Nether= , approaching y boundary of Nether=, approchant de la limite y du Nether
@1@2@3@4= @1@2@3@4=
Center/Mantle, but outside the caverns= Center/Mantle, but outside the caverns=Centre/Manteau, mais à l'extérieur des cavernes
Center/Mantle, inside cavern= Center/Mantle, inside cavern=Centre/Manteau, à l'intérieur d'une caverne
Describes which region of the nether the player is in= Describes which region of the nether the player is in=Indique dans quelle région du Nether se trouve le joueur
Negative nether= Negative nether=Nether négatif
Positive nether= Positive nether=Nether positif
Shell between negative nether and center region= Shell between negative nether and center region=Coquille entre le Nether négatif et la région centrale
Shell between positive nether and center region= Shell between positive nether and center region=Coquille entre le Nether positif et la région centrale
The Overworld= The Overworld=L'Overworld
Unknown player position= Unknown player position=Position du joueur inconnue
[Perlin @1] = [Perlin @1] =
### nodes.lua ### ### nodes.lua ###
A finely finished block of solid Nether Basalt.= A Deep Netherrack Wall=Un mur profond en Netherrack
A rough cut solid block of Nether Basalt.= A Netherrack Wall=Un mur en Netherrack
A thin crust of cooled lava with liquid lava beneath= A finely finished block of solid Nether Basalt.=Un bloc fini de basalte du Nether solide.
A vent in the earth emitting steam and gas= A rough cut solid block of Nether Basalt.=Un bloc solide de basalte du Nether taillé à la hache.
Can be repurposed to provide puffs of smoke in a chimney= A thin crust of cooled lava with liquid lava beneath=Une croûte fine de lave refroidie avec de la lave liquide en dessous
Chiselled Basalt= A vent in the earth emitting steam and gas=Une fissure dans la terre émettant de la vapeur et du gaz
Can be repurposed to provide puffs of smoke in a chimney=Peut être réutilisé pour produire des bouffées de fumée dans une cheminée
Chiselled Basalt=Basalte sculpté
Columns of dark basalt found only in magma oceans deep within the Nether.= Columns of dark basalt found only in magma oceans deep within the Nether.=Colonnes de basalte noir que l'on trouve uniquement dans les océans de magma profonds du Nether.
Compressed Netherbrick= Compressed Netherbrick=Briques du Nether compressées
Cracked Nether Brick= Cracked Nether Brick=Briques du Nether craquelées
Deep Glowstone= Deep Glowstone=Pierre lumineuse profonde
Deep Netherrack= Deep Nether Brick=Briques du Nether profondes
Fumarolic Chimney= Deep Nether Slab=Dalle du Nether profonde
Fumarolic Chimney Corner= Deep Nether Stair=Escalier du Nether profond
Fumarolic Chimney Slab= Deep Netherrack=Netherrack profond
Deep Netherrack Slab=Dalle de Netherrack profonde
Deep Netherrack Stair=Escalier de Netherrack profond
Fumarolic Chimney=Cheminée fumarolique
Fumarolic Chimney Corner=Coin de cheminée fumarolique
Fumarolic Chimney Slab=Dalle de cheminée fumarolique
Glowstone=Pierre lumineuse Glowstone=Pierre lumineuse
Hewn Basalt= Hewn Basalt=Basalte taillé
Inner Deep Nether Stair=Escalier intérieur du Nether profond
Inner Nether Stair=Escalier intérieur du Nether Inner Nether Stair=Escalier intérieur du Nether
Lava Crust= Lava Crust=Croûte de lave
Lava crust is strong enough to walk on, but still hot enough to inflict burns.= Lava crust is strong enough to walk on, but still hot enough to inflict burns.=La croûte de lave est assez solide pour marcher dessus, mais encore assez chaude pour causer des brûlures
Nether Basalt= Nether Basalt=Basalte du Nether
Nether Beryl=Béryl du Nether
Nether Berylite=Bérylite du Nether
Nether Brick=Brique du Nether Nether Brick=Brique du Nether
Nether Brick Fence=Barrière en briques du Nether Nether Brick Fence=Barrière en briques du Nether
Nether Brick Fence Rail=Rail de barrière en briques du Nether
Nether Crystal Pane=Panneau de cristal du Nether
Nether Slab=Dalle du Nether Nether Slab=Dalle du Nether
Nether Stair=Escalier du Nether Nether Stair=Escalier du Nether
Nether geode crystal, found lining the interior walls of Nether geodes=Cristal de géode du Nether, trouvé le long des parois intérieures des géodes du Nether
Nether geode crystal. A crystalline structure with faint glow found inside large Nether geodes=Cristal de géode du Nether. Une structure cristalline avec une faible lueur trouvée à l'intérieur des grandes géodes du Nether.
Netherrack=Roche du Nether Netherrack=Roche du Nether
Netherrack from deep in the mantle= Netherrack from deep in the mantle=Roche du Nether provenant des profondeurs du manteau
Netherrack stair= Netherrack Slab=Dalle du Nether
Netherrack Stair=Escalier du Nether
Nethersand=Sable du Nether Nethersand=Sable du Nether
Outer Deep Nether Stair=Escalier extérieur profond du Nether
Outer Nether Stair=Escalier extérieur du Nether Outer Nether Stair=Escalier extérieur du Nether
Portal= Portal=Portail
### portal_api.lua ### ### portal_api.lua ###
@ -82,7 +101,7 @@ In all my travels, and time spent in the Great Libraries, I have encountered no
In all my travels, and time spent in the Great Libraries, I have encountered no shortage of legends surrounding preternatural doorways said to open into other worlds, yet only one can I confirm as being more than merely a story.=Après tous mes voyages, et le temps passé dans les Grandes Bibliothèques, je ne manque pas de légendes sur les portes surnaturelles qui, dit-on souvrent vers dautres mondes, mais seul une personne peut confirmer que ce sont plus que de simples histoires. In all my travels, and time spent in the Great Libraries, I have encountered no shortage of legends surrounding preternatural doorways said to open into other worlds, yet only one can I confirm as being more than merely a story.=Après tous mes voyages, et le temps passé dans les Grandes Bibliothèques, je ne manque pas de légendes sur les portes surnaturelles qui, dit-on souvrent vers dautres mondes, mais seul une personne peut confirmer que ce sont plus que de simples histoires.
Mysterious forces prevented you from opening that portal. Please try another location= Mysterious forces prevented you from opening that portal. Please try another location=Des forces mystérieuses vous empêchent d'ouvrir ce portail. Veuillez essayer un autre emplacement.
Portal wormhole=Vortex du portail Portal wormhole=Vortex du portail
@ -107,9 +126,16 @@ There is a floating land of hills and forests up there, over the edges of which
### tools.lua ### ### tools.lua ###
Nether Axe= Nether Axe=Hache du Nether
Nether Ingot= Nether Ingot=Lingot du Nether
Nether Lump= Nether Lump=Morceau du Nether
Nether Pickaxe= Nether Pickaxe@nWell suited for mining netherrack=Pioche du Nether@nBien adaptée pour miner la roche du Nether
Nether Shovel= Nether Shovel=Pelle du Nether
Nether Sword= Nether Sword=Épée du Nether
Nether staff of Eternal Light@nCreates glowstone from netherrack=Bâton du Nether de lumière éternelle@nCrée des blocs de pierre lumineuse à partir de roche du Nether
Nether staff of Light@nTemporarily transforms the netherrack into glowstone=Bâton du Nether de lumière@nTransforme temporairement la roche du Nether en blocs de pierre lumineuse
Uniquely suited for mining netherrack, with minimal wear when doing so. Blunts quickly on other materials.=Convient parfaitement pour miner la roche du Nether avec une usure minimale. S'émousse rapidement sur les autres matériaux.

View File

@ -31,6 +31,8 @@ Unknown player position=
### nodes.lua ### ### nodes.lua ###
A Deep Netherrack Wall=
A Netherrack Wall=
A finely finished block of solid Nether Basalt.= A finely finished block of solid Nether Basalt.=
A rough cut solid block of Nether Basalt.= A rough cut solid block of Nether Basalt.=
A thin crust of cooled lava with liquid lava beneath= A thin crust of cooled lava with liquid lava beneath=
@ -43,26 +45,43 @@ Columns of dark basalt found only in magma oceans deep within the Nether.=
Compressed Netherbrick= Compressed Netherbrick=
Cracked Nether Brick= Cracked Nether Brick=
Deep Glowstone= Deep Glowstone=
Deep Nether Brick=
Deep Nether Slab=
Deep Nether Stair=
Deep Netherrack= Deep Netherrack=
Deep Netherrack Slab=
Deep Netherrack Stair=
Fumarolic Chimney= Fumarolic Chimney=
Fumarolic Chimney Corner= Fumarolic Chimney Corner=
Fumarolic Chimney Slab= Fumarolic Chimney Slab=
Glowstone= Glowstone=
Hewn Basalt= Hewn Basalt=
Inner Deep Nether Stair=
Inner Nether Stair= Inner Nether Stair=
Lava Crust= Lava Crust=
Lava crust is strong enough to walk on, but still hot enough to inflict burns.= Lava crust is strong enough to walk on, but still hot enough to inflict burns.=
Nether Basalt= Nether Basalt=
Nether Beryl=
Nether Berylite=
Nether Brick= Nether Brick=
Nether Brick Fence= Nether Brick Fence=
Nether Brick Fence Rail=
Nether Crystal Pane=
Nether Slab= Nether Slab=
Nether Stair= Nether Stair=
Nether geode crystal, found lining the interior walls of Nether geodes=
Nether geode crystal. A crystalline structure with faint glow found inside large Nether geodes=
Netherrack= Netherrack=
Netherrack from deep in the mantle= Netherrack from deep in the mantle=
Netherrack stair= Netherrack Slab=
Netherrack Stair=
Nethersand= Nethersand=
Outer Deep Nether Stair=
Outer Nether Stair= Outer Nether Stair=
Portal= Portal=
@ -109,6 +128,13 @@ There is a floating land of hills and forests up there, over the edges of which
Nether Axe= Nether Axe=
Nether Ingot= Nether Ingot=
Nether Lump= Nether Lump=
Nether Pickaxe= Nether Pickaxe@nWell suited for mining netherrack=
Nether Shovel= Nether Shovel=
Nether Sword= Nether Sword=
Nether staff of Eternal Light@nCreates glowstone from netherrack=
Nether staff of Light@nTemporarily transforms the netherrack into glowstone=
Uniquely suited for mining netherrack, with minimal wear when doing so. Blunts quickly on other materials.=

View File

@ -71,6 +71,7 @@ end
-- Load specialty helper functions -- Load specialty helper functions
dofile(nether.path .. "/mapgen_dungeons.lua") dofile(nether.path .. "/mapgen_dungeons.lua")
dofile(nether.path .. "/mapgen_mantle.lua") dofile(nether.path .. "/mapgen_mantle.lua")
dofile(nether.path .. "/mapgen_geodes.lua")
-- Misc math functions -- Misc math functions
@ -170,7 +171,11 @@ mapgen.shift_existing_biomes(NETHER_FLOOR, NETHER_CEILING)
-- Ores and decorations can be registered against "nether:rack" instead, and the lua -- Ores and decorations can be registered against "nether:rack" instead, and the lua
-- on_generate() callback will carve the Nether with nether:rack before invoking -- on_generate() callback will carve the Nether with nether:rack before invoking
-- generate_decorations and generate_ores. -- generate_decorations and generate_ores.
minetest.register_node("nether:native_mapgen", {}) -- It is disguised as stone to hide any bug where it leaks out of the nether, such as
-- https://github.com/minetest/minetest/issues/13440 or if on_generated() somehow was aborted.
local stone_copy_def = table.copy(minetest.registered_nodes["default:stone"] or {})
stone_copy_def.drop = stone_copy_def.drop or "default:stone" -- probably already defined as cobblestone
minetest.register_node("nether:native_mapgen", stone_copy_def)
minetest.register_biome({ minetest.register_biome({
name = "nether_caverns", name = "nether_caverns",
@ -283,6 +288,7 @@ local dbuf = {}
local c_air = minetest.get_content_id("air") local c_air = minetest.get_content_id("air")
local c_netherrack = minetest.get_content_id("nether:rack") local c_netherrack = minetest.get_content_id("nether:rack")
local c_netherrack_deep = minetest.get_content_id("nether:rack_deep") local c_netherrack_deep = minetest.get_content_id("nether:rack_deep")
local c_crystaldark = minetest.get_content_id("nether:geode")
local c_lavasea_source = minetest.get_content_id("nether:lava_source") -- same as lava but with staggered animation to look better as an ocean local c_lavasea_source = minetest.get_content_id("nether:lava_source") -- same as lava but with staggered animation to look better as an ocean
local c_lava_crust = minetest.get_content_id("nether:lava_crust") local c_lava_crust = minetest.get_content_id("nether:lava_crust")
local c_native_mapgen = minetest.get_content_id("nether:native_mapgen") local c_native_mapgen = minetest.get_content_id("nether:native_mapgen")
@ -382,7 +388,8 @@ local function on_generated(minp, maxp, seed)
if cave_noise > tcave then if cave_noise > tcave then
-- Prime region -- Prime region
-- This was the only region in initial versions of the Nether mod. -- This was the only region in initial versions of the Nether mod.
-- It is the only region which portals from the surface will open into. -- It is the only region which portals from the surface will open into,
-- getting to any other regions in the Nether will require Shanks' Pony.
data[vi] = c_air data[vi] = c_air
contains_nether = true contains_nether = true
@ -392,12 +399,11 @@ local function on_generated(minp, maxp, seed)
-- Reaching here would require the player to first find and journey through the central region, -- Reaching here would require the player to first find and journey through the central region,
-- as it's always separated from the Prime region by the central region. -- as it's always separated from the Prime region by the central region.
data[vi] = c_netherrack -- For now I've just left this region as solid netherrack instead of air. data[vi] = mapgen.getGeodeInteriorNodeId(x, y, z)-- function from mapgen_geodes.lua
-- Only set contains_nether to true here if you want tunnels created between the secondary region -- Only set contains_nether to true here if you want tunnels created between the secondary region
-- and the central region. -- and the central region.
--contains_nether = true contains_nether = true
--data[vi] = c_air
else else
-- netherrack walls and/or center region/mantle -- netherrack walls and/or center region/mantle
abs_cave_noise = math_abs(cave_noise) abs_cave_noise = math_abs(cave_noise)
@ -414,7 +420,11 @@ local function on_generated(minp, maxp, seed)
data[vi] = c_netherrack_deep data[vi] = c_netherrack_deep
else else
-- the shell seperating the mantle from the rest of the nether... -- the shell seperating the mantle from the rest of the nether...
if cave_noise > 0 then
data[vi] = c_netherrack -- excavate_dungeons() will mostly reverse this inside dungeons data[vi] = c_netherrack -- excavate_dungeons() will mostly reverse this inside dungeons
else
data[vi] = c_crystaldark
end
end end
end end

View File

@ -33,6 +33,7 @@ minetest.set_gen_notify({dungeon = true})
local c_air = minetest.get_content_id("air") local c_air = minetest.get_content_id("air")
local c_netherrack = minetest.get_content_id("nether:rack") local c_netherrack = minetest.get_content_id("nether:rack")
local c_netherrack_deep = minetest.get_content_id("nether:rack_deep") local c_netherrack_deep = minetest.get_content_id("nether:rack_deep")
local c_crystaldark = minetest.get_content_id("nether:geode")
local c_dungeonbrick = minetest.get_content_id("nether:brick") local c_dungeonbrick = minetest.get_content_id("nether:brick")
local c_dungeonbrick_alt = minetest.get_content_id("nether:brick_cracked") local c_dungeonbrick_alt = minetest.get_content_id("nether:brick_cracked")
local c_netherbrick_slab = minetest.get_content_id("stairs:slab_nether_brick") local c_netherbrick_slab = minetest.get_content_id("stairs:slab_nether_brick")
@ -164,7 +165,7 @@ nether.mapgen.excavate_dungeons = function(data, area, rooms)
vi = area:index(room_min.x, y, z) vi = area:index(room_min.x, y, z)
for x = room_min.x, room_max.x do for x = room_min.x, room_max.x do
node_id = data[vi] node_id = data[vi]
if node_id == c_netherrack or node_id == c_netherrack_deep then data[vi] = c_air end if node_id == c_netherrack or node_id == c_netherrack_deep or node_id == c_crystaldark then data[vi] = c_air end
vi = vi + 1 vi = vi + 1
end end
end end
@ -181,7 +182,7 @@ nether.mapgen.excavate_dungeons = function(data, area, rooms)
vi = vi + area.ystride vi = vi + area.ystride
node_id = data[vi] node_id = data[vi]
-- searching forward of the stairs could also be done -- searching forward of the stairs could also be done
if node_id == c_netherrack or node_id == c_netherrack_deep then data[vi] = c_air end if node_id == c_netherrack or node_id == c_netherrack_deep or node_id == c_crystaldark then data[vi] = c_air end
end end
end end
end end
@ -231,11 +232,11 @@ nether.mapgen.decorate_dungeons = function(data, area, rooms)
and room_min.z > minEdge.z and room_max.z < maxEdge.z then and room_min.z > minEdge.z and room_max.z < maxEdge.z then
--data[area:indexp(roomInfo)] = minetest.get_content_id("default:mese_post_light") -- debug --data[area:indexp(roomInfo)] = minetest.get_content_id("default:mese_post_light") -- debug
-- Can't use glass panes because they need the param data set. -- Glass panes can't go in the windows because we aren't setting param data.
-- Until whisper glass is added, every window will be made of netherbrick fence (rather -- Until a Nether glass is added, every window will be made of netherbrick fence rather
-- than material depending on room_seed) -- than material depending on room_seed.
local window_node = c_netherfence local window_node = c_netherfence
--if c_netherglass ~= nil and room_seed % 20 >= 12 then window_node = c_crystallight end --if c_netherglass ~= nil and room_seed % 20 >= 12 then window_node = c_netherglass end
local function placeWindow(vi, viOutsideOffset, windowNo) local function placeWindow(vi, viOutsideOffset, windowNo)
if is_dungeon_brick(data[vi]) and is_dungeon_brick(data[vi + yStride]) then if is_dungeon_brick(data[vi]) and is_dungeon_brick(data[vi + yStride]) then

221
mapgen_geodes.lua Normal file
View File

@ -0,0 +1,221 @@
--[[
Nether mod for minetest
This file contains helper functions for generating geode interiors,
a proof-of-concept to demonstrate how the secondary/spare region
in the nether might be put to use by someone.
Copyright (C) 2021 Treer
Permission to use, copy, modify, and/or distribute this software for
any purpose with or without fee is hereby granted, provided that the
above copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR
BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
]]--
local debugf = nether.debug
local mapgen = nether.mapgen
-- Content ids
local c_air = minetest.get_content_id("air")
local c_crystal = minetest.get_content_id("nether:geodelite") -- geodelite has a faint glow
local c_netherrack = minetest.get_content_id("nether:rack")
local c_glowstone = minetest.get_content_id("nether:glowstone")
-- Math funcs
local math_max, math_min, math_abs, math_floor, math_pi = math.max, math.min, math.abs, math.floor, math.pi -- avoid needing table lookups each time a common math function is invoked
-- Create a tiling space of close-packed spheres, using Hexagonal close packing
-- of spheres with radius 0.5.
-- With a layer of spheres on a flat surface, if the pack-z distance is 1 due to 0.5
-- radius then the pack-x distance will be the height of an equilateral triangle: sqrt(3) / 2,
-- and the pack-y distance between each layer will be sqrt(6) / 3,
-- The tessellating space will be a rectangular box of 2*pack-x by 1*pack-z by 3*pack-y
local xPack = math.sqrt(3)/2 -- 0.866, height of an equalateral triangle
local xPack2 = xPack * 2 -- 1.732
local yPack = math.sqrt(6) / 3 -- 0.816, y height of each layer
local yPack2 = yPack * 2
local yPack3 = yPack * 3
local layer2offsetx = xPack / 3 -- 0.289, height to center of equalateral triangle
local layer3offsetx = xPack2 / 3 -- 0.577
local structureSize = 50 -- magic numbers may need retuning if this changes too much
local layer1 = {
{0, 0, 0},
{0, 0, 1},
{xPack, 0, -0.5},
{xPack, 0, 0.5},
{xPack, 0, 1.5},
{xPack2, 0, 0},
{xPack2, 0, 1},
}
local layer2 = {
{layer2offsetx - xPack, yPack, 0},
{layer2offsetx - xPack, yPack, 1},
{layer2offsetx, yPack, -0.5},
{layer2offsetx, yPack, 0.5},
{layer2offsetx, yPack, 1.5},
{layer2offsetx + xPack, yPack, 0},
{layer2offsetx + xPack, yPack, 1},
{layer2offsetx + xPack2, yPack, -0.5},
{layer2offsetx + xPack2, yPack, 0.5},
{layer2offsetx + xPack2, yPack, 1.5},
}
local layer3 = {
{layer3offsetx - xPack, yPack2, -0.5},
{layer3offsetx - xPack, yPack2, 0.5},
{layer3offsetx - xPack, yPack2, 1.5},
{layer3offsetx, yPack2, 0},
{layer3offsetx, yPack2, 1},
{layer3offsetx + xPack, yPack2, -0.5},
{layer3offsetx + xPack, yPack2, 0.5},
{layer3offsetx + xPack, yPack2, 1.5},
{layer3offsetx + xPack2, yPack2, 0},
{layer3offsetx + xPack2, yPack2, 1},
}
local layer4 = {
{0, yPack3, 0},
{0, yPack3, 1},
{xPack, yPack3, -0.5},
{xPack, yPack3, 0.5},
{xPack, yPack3, 1.5},
{xPack2, yPack3, 0},
{xPack2, yPack3, 1},
}
local layers = {
{y = layer1[1][2], points = layer1}, -- layer1[1][2] is the y value of the first point in layer1, and all spheres in a layer have the same y
{y = layer2[1][2], points = layer2},
{y = layer3[1][2], points = layer3},
{y = layer4[1][2], points = layer4},
}
-- Geode mapgen functions (AKA proof of secondary/spare region concept)
-- fast for small lists
function insertionSort(array)
local i
for i = 2, #array do
local key = array[i]
local j = i - 1
while j > 0 and array[j] > key do
array[j + 1] = array[j]
j = j - 1
end
array[j + 1] = key
end
return array
end
local distSquaredList = {}
local adj_x = 0
local adj_y = 0
local adj_z = 0
local lasty, lastz
local warpx, warpz
-- It's quite a lot to calculate for each air node, but its not terribly slow and
-- it'll be pretty darn rare for chunks in the secondary region to ever get emerged.
mapgen.getGeodeInteriorNodeId = function(x, y, z)
if z ~= lastz then
lastz = z
-- Calculate structure warping
-- To avoid calculating this for each node there's no warping as you look along the x axis :(
adj_y = math.sin(math_pi / 222 * y) * 30
if y ~= lasty then
lasty = y
warpx = math.sin(math_pi / 100 * y) * 10
warpz = math.sin(math_pi / 43 * y) * 15
end
local twistRadians = math_pi / 73 * y
local sinTwist, cosTwist = math.sin(twistRadians), math.cos(twistRadians)
adj_x = cosTwist * warpx - sinTwist * warpz
adj_z = sinTwist * warpx + cosTwist * warpz
end
-- convert x, y, z into a position in the tessellating space
local cell_x = (((x + adj_x) / xPack2 + 0.5) % structureSize) / structureSize * xPack2
local cell_y = (((y + adj_y) / yPack3 + 0.5) % structureSize) / structureSize * yPack3
local cell_z = (((z + adj_z) + 0.5) % structureSize) / structureSize -- zPack = 1, so can be omitted
local iOut = 1
local i, j
local canSkip = false
for i = 1, #layers do
local layer = layers[i]
local dy = cell_y - layer.y
if dy > -0.71 and dy < 0.71 then -- optimization - don't include points to far away to make a difference. (0.71 comes from sin(45°))
local points = layer.points
for j = 1, #points do
local point = points[j]
local dx = cell_x - point[1]
local dz = cell_z - point[3]
local distSquared = dx*dx + dy*dy + dz*dz
if distSquared < 0.25 then
-- optimization - point is inside a sphere, so cannot be a wall edge. (0.25 comes from radius of 0.5 squared)
return c_air
end
distSquaredList[iOut] = distSquared
iOut = iOut + 1
end
end
end
-- clear the rest of the array instead of creating a new one to hopefully reduce luajit mem leaks.
while distSquaredList[iOut] ~= nil do
rawset(distSquaredList, iOut, nil)
iOut = iOut + 1
end
insertionSort(distSquaredList)
local d3_1 = distSquaredList[3] - distSquaredList[1]
local d3_2 = distSquaredList[3] - distSquaredList[2]
--local d4_1 = distSquaredList[4] - distSquaredList[1]
--local d4_3 = distSquaredList[4] - distSquaredList[3]
-- Some shape formulas (tuned for a structureSize of 50)
-- (d3_1 < 0.05) gives connective lines
-- (d3_1 < 0.05 or d3_2 < .02) give fancy elven bridges - prob doesn't need the d3_1 part
-- ((d3_1 < 0.05 or d3_2 < .02) and distSquaredList[1] > .3) tapers the fancy connections in the middle
-- (d4_3 < 0.03 and d3_2 < 0.03) produces caltrops at intersections
-- (d4_1 < 0.1) produces spherish balls at intersections
-- The idea is voronoi based - edges in a voronoi diagram are where each nearby point is at equal distance.
-- In this case we use squared distances to avoid calculating square roots.
if (d3_1 < 0.05 or d3_2 < .02) and distSquaredList[1] > .3 then
return c_crystal
elseif (distSquaredList[4] - distSquaredList[1]) < 0.08 then
return c_glowstone
else
return c_air
end
end

View File

@ -1,4 +1,4 @@
name = nether name = nether
description = Adds a deep underground realm with different mapgen that you can reach with obsidian portals. description = Adds a deep underground realm with different mapgen that you can reach with obsidian portals.
depends = stairs, default depends = stairs, default
optional_depends = moreblocks, mesecons, loot, dungeon_loot, doc_basics, fire, climate_api, ethereal, walls optional_depends = toolranks, moreblocks, mesecons, loot, dungeon_loot, doc_basics, fire, climate_api, ethereal, xpanes, walls

120
nodes.lua
View File

@ -180,6 +180,63 @@ minetest.register_node("nether:rack", {
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
}) })
-- Geode crystals can only be introduced by the biomes-based mapgen, since it requires the
-- MT 5.0 world-align texture features.
minetest.register_node("nether:geode", {
description = S("Nether Beryl"),
_doc_items_longdesc = S("Nether geode crystal, found lining the interior walls of Nether geodes"),
tiles = {{
name = "nether_geode.png",
align_style = "world",
scale = 4
}},
is_ground_content = true,
groups = {cracky = 3, oddly_breakable_by_hand = 3, nether_crystal = 1},
sounds = default.node_sound_glass_defaults(),
})
-- Nether Berylite is a Beryl that can seen in the dark, used to light up the internal structure
-- of the geode, so to avoid player confusion we'll just have it drop plain Beryl, and have only
-- plain Beryl in the creative inventory.
minetest.register_node("nether:geodelite", {
description = S("Nether Berylite"),
_doc_items_longdesc = S("Nether geode crystal. A crystalline structure with faint glow found inside large Nether geodes"),
tiles = {{
name = "nether_geode.png",
align_style = "world",
scale = 4
}},
light_source = 2,
drop = "nether:geode",
is_ground_content = true,
groups = {cracky = 3, oddly_breakable_by_hand = 3, nether_crystal = 1, not_in_creative_inventory = 1},
sounds = default.node_sound_glass_defaults(),
})
if minetest.get_modpath("xpanes") and minetest.global_exists("xpanes") and xpanes.register_pane ~= nil then
xpanes.register_pane("nether_crystal_pane", {
description = S("Nether Crystal Pane"),
textures = {
{
name = "nether_geode_glass.png",
align_style = "world",
scale = 2
},
"",
"xpanes_edge_obsidian.png"
},
inventory_image = "([combine:32x32:-8,-8=nether_geode_glass.png:24,-8=nether_geode_glass.png:-8,24=nether_geode_glass.png:24,24=nether_geode_glass.png)^[resize:16x16^[multiply:#922^default_obsidian_glass.png",
wield_image = "([combine:32x32:-8,-8=nether_geode_glass.png:24,-8=nether_geode_glass.png:-8,24=nether_geode_glass.png:24,24=nether_geode_glass.png)^[resize:16x16^[multiply:#922^default_obsidian_glass.png", use_texture_alpha = true,
sounds = default.node_sound_glass_defaults(),
groups = {snappy=2, cracky=3, oddly_breakable_by_hand=3},
recipe = {
{"group:nether_crystal", "group:nether_crystal", "group:nether_crystal"},
{"group:nether_crystal", "group:nether_crystal", "group:nether_crystal"}
}
})
end
-- Deep Netherrack, found in the mantle / central magma layers -- Deep Netherrack, found in the mantle / central magma layers
minetest.register_node("nether:rack_deep", { minetest.register_node("nether:rack_deep", {
description = S("Deep Netherrack"), description = S("Deep Netherrack"),
@ -249,26 +306,6 @@ minetest.register_node("nether:brick_cracked", {
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
}) })
local fence_texture =
"default_fence_overlay.png^nether_brick.png^default_fence_overlay.png^[makealpha:255,126,126"
minetest.register_node("nether:fence_nether_brick", {
description = S("Nether Brick Fence"),
drawtype = "fencelike",
tiles = {"nether_brick.png"},
inventory_image = fence_texture,
wield_image = fence_texture,
paramtype = "light",
sunlight_propagates = true,
is_ground_content = false,
selection_box = {
type = "fixed",
fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7},
},
groups = {cracky = 2, level = 2},
sounds = default.node_sound_stone_defaults(),
})
minetest.register_node("nether:brick_deep", { minetest.register_node("nether:brick_deep", {
description = S("Deep Nether Brick"), description = S("Deep Nether Brick"),
tiles = {{ tiles = {{
@ -281,6 +318,34 @@ minetest.register_node("nether:brick_deep", {
sounds = default.node_sound_stone_defaults() sounds = default.node_sound_stone_defaults()
}) })
-- Register fence and rails
local fence_texture =
"default_fence_overlay.png^nether_brick.png^default_fence_overlay.png^[makealpha:255,126,126"
local rail_texture =
"default_fence_rail_overlay.png^nether_brick.png^default_fence_rail_overlay.png^[makealpha:255,126,126"
default.register_fence("nether:fence_nether_brick", {
description = S("Nether Brick Fence"),
texture = "nether_brick.png",
inventory_image = fence_texture,
wield_image = fence_texture,
material = "nether:brick",
groups = {cracky = 2, level = 2},
sounds = default.node_sound_stone_defaults()
})
default.register_fence_rail("nether:fence_rail_nether_brick", {
description = S("Nether Brick Fence Rail"),
texture = "nether_brick.png",
inventory_image = rail_texture,
wield_image = rail_texture,
material = "nether:brick",
groups = {cracky = 2, level = 2},
sounds = default.node_sound_stone_defaults()
})
-- Register stair and slab -- Register stair and slab
-- Nether bricks can be made into stairs, slabs, inner stairs, and outer stairs -- Nether bricks can be made into stairs, slabs, inner stairs, and outer stairs
@ -318,7 +383,7 @@ stairs.register_stair(
"nether:rack", "nether:rack",
{cracky = 2, level = 2}, {cracky = 2, level = 2},
{"nether_rack.png"}, {"nether_rack.png"},
S("Netherrack stair"), S("Netherrack Stair"),
minetest.registered_nodes["nether:rack"].sounds minetest.registered_nodes["nether:rack"].sounds
) )
stairs.register_slab( -- register a slab without adding inner and outer stairs stairs.register_slab( -- register a slab without adding inner and outer stairs
@ -326,7 +391,7 @@ stairs.register_slab( -- register a slab without adding inner and outer stairs
"nether:rack", "nether:rack",
{cracky = 2, level = 2}, {cracky = 2, level = 2},
{"nether_rack.png"}, {"nether_rack.png"},
S("Deep Netherrack slab"), S("Netherrack Slab"),
minetest.registered_nodes["nether:rack"].sounds minetest.registered_nodes["nether:rack"].sounds
) )
@ -335,7 +400,7 @@ stairs.register_stair(
"nether:rack_deep", "nether:rack_deep",
{cracky = 2, level = 2}, {cracky = 2, level = 2},
{"nether_rack_deep.png"}, {"nether_rack_deep.png"},
S("Deep Netherrack stair"), S("Deep Netherrack Stair"),
minetest.registered_nodes["nether:rack_deep"].sounds minetest.registered_nodes["nether:rack_deep"].sounds
) )
stairs.register_slab( -- register a slab without adding inner and outer stairs stairs.register_slab( -- register a slab without adding inner and outer stairs
@ -343,14 +408,14 @@ stairs.register_slab( -- register a slab without adding inner and outer stairs
"nether:rack_deep", "nether:rack_deep",
{cracky = 2, level = 2}, {cracky = 2, level = 2},
{"nether_rack_deep.png"}, {"nether_rack_deep.png"},
S("Deep Netherrack slab"), S("Deep Netherrack Slab"),
minetest.registered_nodes["nether:rack_deep"].sounds minetest.registered_nodes["nether:rack_deep"].sounds
) )
-- Connecting walls -- Connecting walls
if minetest.get_modpath("walls") and minetest.global_exists("walls") and walls.register ~= nil then if minetest.get_modpath("walls") and minetest.global_exists("walls") and walls.register ~= nil then
walls.register("nether:rack_wall", "A Netherrack wall", "nether_rack.png", "nether:rack", minetest.registered_nodes["nether:rack"].sounds) walls.register("nether:rack_wall", S("A Netherrack Wall"), "nether_rack.png", "nether:rack", minetest.registered_nodes["nether:rack"].sounds)
walls.register("nether:rack_deep_wall", "A Deep Netherrack wall", "nether_rack_deep.png", "nether:rack_deep", minetest.registered_nodes["nether:rack_deep"].sounds) walls.register("nether:rack_deep_wall", S("A Deep Netherrack Wall"), "nether_rack_deep.png", "nether:rack_deep", minetest.registered_nodes["nether:rack_deep"].sounds)
end end
-- StairsPlus -- StairsPlus
@ -713,6 +778,7 @@ minetest.register_node("nether:lava_crust", {
--liquid_viscosity = 7, --liquid_viscosity = 7,
damage_per_second = 2, damage_per_second = 2,
groups = {oddly_breakable_by_hand = 3, cracky = 3, explody = 1, igniter = 1}, groups = {oddly_breakable_by_hand = 3, cracky = 3, explody = 1, igniter = 1},
sounds = default.node_sound_gravel_defaults(),
}) })
@ -775,7 +841,7 @@ local function fumarole_onTimer(pos, elapsed)
local smoke_time_adj = 1 local smoke_time_adj = 1
local posAbove = {x = pos.x, y = pos.y + 1, z = pos.z} local posAbove = {x = pos.x, y = pos.y + 1, z = pos.z}
local extinguish = minetest.get_node(posAbove).name ~= "air" local extinguish = inNether and minetest.get_node(posAbove).name ~= "air"
if extinguish or (canCatchFire and math.floor(elapsed) % 7 == 0) then if extinguish or (canCatchFire and math.floor(elapsed) % 7 == 0) then

View File

@ -2166,22 +2166,20 @@ function nether.unregister_portal(name)
end end
function nether.register_portal_ignition_item(item_name, ignition_failure_sound) function nether.register_portal_ignition_item(item_name, ignition_failure_sound)
local old_on_place = minetest.registered_items[item_name].on_place or minetest.item_place
minetest.override_item(item_name, { minetest.override_item(item_name, {
on_place = function(stack, placer, pt) on_place = function(stack, placer, pt, ...)
local done = false
if pt.under and nether.is_frame_node[minetest.get_node(pt.under).name] then if pt.under and nether.is_frame_node[minetest.get_node(pt.under).name] then
done = ignite_portal(pt.under, placer:get_player_name()) local done = ignite_portal(pt.under, placer:get_player_name())
if done and not minetest.settings:get_bool("creative_mode") then if done and not minetest.settings:get_bool("creative_mode") then
stack:take_item() stack:take_item()
end end
end
if not done and ignition_failure_sound ~= nil then if not done and ignition_failure_sound ~= nil then
minetest.sound_play(ignition_failure_sound, {pos = pt.under, max_hear_distance = 10}) minetest.sound_play(ignition_failure_sound, {pos = pt.under, max_hear_distance = 10})
end end
return stack return stack
end
return old_on_place(stack, placer, pt, ...)
end, end,
}) })

BIN
textures/nether_geode.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 568 B

View File

@ -153,6 +153,38 @@ minetest.register_craft({
}) })
if minetest.get_modpath("toolranks") then
local function add_toolranks(name)
local nethertool_after_use = ItemStack(name):get_definition().after_use
toolranks.add_tool(name)
local toolranks_after_use = ItemStack(name):get_definition().after_use
if nethertool_after_use == nil or nethertool_after_use == toolranks_after_use then
return
end
minetest.override_item(name, {
after_use = function(itemstack, user, node, digparams)
-- combine nethertool_after_use and toolranks_after_use by allowing
-- nethertool_after_use() to calculate the wear...
local initial_wear = itemstack:get_wear()
itemstack = nethertool_after_use(itemstack, user, node, digparams)
local wear = itemstack:get_wear() - initial_wear
itemstack:set_wear(initial_wear) -- restore/undo the wear
-- ...and have toolranks_after_use() apply the wear.
digparams.wear = wear
return toolranks_after_use(itemstack, user, node, digparams)
end
})
end
add_toolranks("nether:pick_nether")
add_toolranks("nether:shovel_nether")
add_toolranks("nether:axe_nether")
add_toolranks("nether:sword_nether")
end
--===========================-- --===========================--
@ -352,10 +384,11 @@ minetest.register_tool("nether:lightstaff_eternal", {
sound = {breaks = "default_tool_breaks"}, sound = {breaks = "default_tool_breaks"},
stack_max = 1, stack_max = 1,
on_use = function(itemstack, user, pointed_thing) on_use = function(itemstack, user, pointed_thing)
if lightstaff_on_use(user, "#23F", 0) then -- was "#8088FF" or "#13F" if lightstaff_on_use(user, "#23F", 0) -- was "#8088FF" or "#13F"
and not minetest.is_creative_enabled(user) then
-- The staff of Eternal Light wears out, to limit how much -- The staff of Eternal Light wears out, to limit how much
-- a player can alter the nether with it. -- a player can alter the nether with it.
itemstack:add_wear(65535 / (nether.lightstaff_uses - 1)) itemstack:add_wear_by_uses(nether.lightstaff_uses)
end end
return itemstack return itemstack
end end