mirror of
https://github.com/minetest-mods/nether.git
synced 2024-11-16 23:40:37 +01:00
Compare commits
16 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
b51b831483 | ||
|
01b6f3c56d | ||
|
a6d1f55f0a | ||
|
d16b530685 | ||
|
ea677c5a1b | ||
|
21c7e2801d | ||
|
3470b1e22e | ||
|
3e809a811b | ||
|
6c6a182366 | ||
|
9c1fa2c843 | ||
|
957fdc887b | ||
|
7dc32f6bb8 | ||
|
a8a6bb00c5 | ||
|
12ca98c25a | ||
|
a03375c5a4 | ||
|
d3f79e961b |
|
@ -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" } },
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -7,3 +7,4 @@ loot?
|
||||||
mesecons?
|
mesecons?
|
||||||
moreblocks?
|
moreblocks?
|
||||||
climate_api?
|
climate_api?
|
||||||
|
xpanes?
|
2
init.lua
2
init.lua
|
@ -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 }
|
||||||
)
|
)
|
||||||
|
|
|
@ -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 s’ouvrent vers d’autres 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 s’ouvrent vers d’autres 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.
|
||||||
|
|
||||||
|
|
|
@ -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.=
|
||||||
|
|
||||||
|
|
20
mapgen.lua
20
mapgen.lua
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
221
mapgen_geodes.lua
Normal 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
|
2
mod.conf
2
mod.conf
|
@ -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
120
nodes.lua
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
BIN
textures/nether_geode.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.7 KiB |
BIN
textures/nether_geode_glass.png
Normal file
BIN
textures/nether_geode_glass.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 568 B |
37
tools.lua
37
tools.lua
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user