15 Commits

Author SHA1 Message Date
76708b02d5 Update the Readme 2022-08-20 20:19:58 +02:00
f12d33c743 Replace deprecated function names (e.g. moveto -> move_to) and make stairs optional 2022-08-20 20:11:35 +02:00
435cef6f81 Remove the unused vector_extras dependency 2022-08-20 19:20:13 +02:00
01cd7c8e5b New nether guide
* Remove code which uses the font size setting to position text and images. Instead use Minetest's hypertext formspec element
* Rewrite many parts of the guide contents, e.g. "you" -> "we", more detailed portal description
* Add a setting to permit viewing it in the overworld (enabled by default)
* Update the Readme

I have set the font size to 24, which works well for me on a 1920x1080 screen with somewhat high DPI. The text written in hypertext apparently ignores the Minetest font size setting, so it may look bad on different screens.
2022-08-19 18:14:44 +02:00
817efcdd29 Add settingtypes.txt to configure player trapping and message logging
There are also some changes to fix problems when trapping is enabled while damage is disabled or the other way round.
2022-08-16 17:25:41 +02:00
6507e43dc5 Do not ignore the portal code if damage is enabled and the "nether_players" file does not exist
I have accidentally introduced the bug in commit 4a7dd247e7.
It was discovered thanks to the people who reported it on the Minetest forum.
2022-08-15 15:47:16 +02:00
27bf94c4d0 Fix portal player y pos being off by 1 node sometimes 2022-07-26 17:52:25 +02:00
27be1dd740 Mention the problematic guide in the Readme 2021-12-22 19:07:12 +01:00
c35d18a519 Fix some deprecation warnings 2021-12-22 18:46:56 +01:00
fb1eca6c11 Add .luacheckrc and do some code fixes 2021-12-22 18:46:52 +01:00
be64a982f8 Remove the invisible folder 2021-12-22 17:53:32 +01:00
56f5909e0f Relicense; WTFPL allows it 2021-12-22 17:45:59 +01:00
7cdd0471a2 depends.txt -> mod.conf 2021-12-22 17:44:27 +01:00
b876d8f2b9 Move the mod description to the forum to reduce duplicate text 2021-12-22 17:39:40 +01:00
870b6a9d47 Fix nether leaves visual_scale
Also, update README
2019-03-10 12:35:51 +01:00
26 changed files with 427 additions and 1047 deletions

View File

@ -1,2 +1,2 @@
GPLv3 (lkloel's version) GPLv3 (lkloel's version)
WTFPL for the changes MIT for the changes

View File

@ -1,26 +1,11 @@
[Mod] nether-pack [nether-pack] For a description of this Minetest mod, please refer to the forum topic:
https://forum.minetest.net/viewtopic.php?f=9&t=10265
This is a modified version of lkjoel's nether mod.
Look here if you want to see the differences:
https://github.com/HybridDog/minetest-nether/compare/lkjoel:master...master
Sadly lkjoel's one disappeared…
Thanks a lot to LeMagnesium, crabman77, Ombridride, Gael-de-Sailly, ObaniGemini and other people from server-minetestforfun for working on this mod.
**Depends:** see [depends.txt](https://raw.githubusercontent.com/HybridDog/nether-pack/master/nether/depends.txt)
**License:** see [LICENSE.txt](https://raw.githubusercontent.com/HybridDog/nether-pack/master/LICENSE.txt)
**Download:** [zip](https://github.com/HybridDog/nether-pack/archive/master.zip), [tar.gz](https://github.com/HybridDog/nether-pack/tarball/master)
a long time ago this happened
![I'm a screenshot!](http://i.imgur.com/pMZYqt9.png)
I assume other screenshots could represent this mod in more serious ways
If you got ideas or found bugs, please tell them to me.
[How to install a mod?](http://wiki.minetest.net/Installing_Mods)
TODO: TODO:
— find a way to get the perlin noise inside [-1; 1] or use another noise * Mapgen: Find a way to get the perlin noise values inside [-1; 1] or use
— add something containing items to that buildings another noise.
— update leaves visual_scale The problem is visible in the nether forest, where the mapgen code flattens
the ceiling if it is very high.
* Mapgen: Generate more detail inside the simple pyramid-like "buildings",
e.g. add a small treasure chest node which contains items

View File

@ -1,365 +0,0 @@
--[[ Nether leaves
minetest.register_node("nether:leaves", {
description = "Nether Leaves",
drawtype = "allfaces_optional",
-- visual_scale = 1.189, --scale^2=sqrt(2)
tiles = {"nether_leaves.png"},
paramtype = "light",
groups = {snappy=3, leafdecay=2},
sounds = default.node_sound_leaves_defaults(),
})]]
--[[ Nether Lava
minetest.register_node("nether:lava_flowing", {
description = "Nether Lava (flowing)",
inventory_image = minetest.inventorycube("default_lava.png"),
drawtype = "flowingliquid",
tiles = {"default_lava.png"},
paramtype = "light",
light_source = LIGHT_MAX - 1,
walkable = false,
pointable = false,
diggable = false,
buildable_to = true,
liquidtype = "flowing",
liquid_alternative_flowing = "nether:lava_flowing",
liquid_alternative_source = "default:lava_source",
liquid_viscosity = LAVA_VISC,
damage_per_second = 4*2,
post_effect_color = {a=192, r=255, g=64, b=0},
special_materials = {
{image="default_lava.png", backface_culling=false},
{image="default_lava.png", backface_culling=true},
},
groups = {lava=3, liquid=2, hot=3},
})
minetest.register_node("nether:lava_source", {
description = "Nether Lava",
inventory_image = minetest.inventorycube("default_lava.png"),
drawtype = "liquid",
tiles = {"default_lava.png"},
paramtype = "light",
light_source = LIGHT_MAX - 1,
walkable = false,
pointable = false,
diggable = false,
buildable_to = true,
liquidtype = "source",
liquid_alternative_flowing = "nether:lava_flowing",
liquid_alternative_source = "default:lava_source",
liquid_viscosity = LAVA_VISC,
damage_per_second = 4*2,
post_effect_color = {a=192, r=255, g=64, b=0},
special_materials = {
-- New-style lava source material (mostly unused)
{image="default_lava.png", backface_culling=false},
},
groups = {lava=3, liquid=2, hot=3},
})]]
-- Throne of Hades
HADES_THRONE = {
-- Lava Moat
{pos={x=-1,y=-1,z=-1}, block="default:lava_source"},
{pos={x=-1,y=-1,z=0}, block="default:lava_source"},
{pos={x=-1,y=-1,z=1}, block="default:lava_source"},
{pos={x=-1,y=-1,z=2}, block="default:lava_source"},
{pos={x=-1,y=-1,z=3}, block="default:lava_source"},
{pos={x=-1,y=-1,z=4}, block="default:lava_source"},
{pos={x=-1,y=-1,z=5}, block="default:lava_source"},
{pos={x=-1,y=-1,z=6}, block="default:lava_source"},
{pos={x=-1,y=-1,z=7}, block="default:lava_source"},
{pos={x=0,y=-1,z=7}, block="default:lava_source"},
{pos={x=1,y=-1,z=7}, block="default:lava_source"},
{pos={x=2,y=-1,z=7}, block="default:lava_source"},
{pos={x=3,y=-1,z=7}, block="default:lava_source"},
{pos={x=4,y=-1,z=7}, block="default:lava_source"},
{pos={x=5,y=-1,z=7}, block="default:lava_source"},
{pos={x=6,y=-1,z=7}, block="default:lava_source"},
{pos={x=6,y=-1,z=6}, block="default:lava_source"},
{pos={x=6,y=-1,z=5}, block="default:lava_source"},
{pos={x=6,y=-1,z=4}, block="default:lava_source"},
{pos={x=6,y=-1,z=3}, block="default:lava_source"},
{pos={x=6,y=-1,z=2}, block="default:lava_source"},
{pos={x=6,y=-1,z=1}, block="default:lava_source"},
{pos={x=6,y=-1,z=0}, block="default:lava_source"},
{pos={x=6,y=-1,z=-1}, block="default:lava_source"},
{pos={x=5,y=-1,z=-1}, block="default:lava_source"},
{pos={x=4,y=-1,z=-1}, block="default:lava_source"},
{pos={x=3,y=-1,z=-1}, block="default:lava_source"},
{pos={x=2,y=-1,z=-1}, block="default:lava_source"},
{pos={x=1,y=-1,z=-1}, block="default:lava_source"},
{pos={x=0,y=-1,z=-1}, block="default:lava_source"},
-- Floor 1
{pos={x=0,y=0,z=0}, block="nether:netherrack"},
{pos={x=0,y=0,z=1}, block="nether:netherrack"},
{pos={x=0,y=0,z=2}, block="nether:netherrack"},
{pos={x=0,y=0,z=3}, block="nether:netherrack"},
{pos={x=0,y=0,z=4}, block="nether:netherrack"},
{pos={x=0,y=0,z=5}, block="nether:netherrack"},
{pos={x=1,y=0,z=5}, block="nether:netherrack"},
{pos={x=2,y=0,z=5}, block="nether:netherrack"},
{pos={x=3,y=0,z=5}, block="nether:netherrack"},
{pos={x=4,y=0,z=5}, block="nether:netherrack"},
{pos={x=5,y=0,z=5}, block="nether:netherrack"},
{pos={x=0,y=0,z=6}, block="nether:netherrack"},
{pos={x=1,y=0,z=6}, block="nether:netherrack"},
{pos={x=2,y=0,z=6}, block="nether:netherrack"},
{pos={x=3,y=0,z=6}, block="nether:netherrack"},
{pos={x=4,y=0,z=6}, block="nether:netherrack"},
{pos={x=5,y=0,z=6}, block="nether:netherrack"},
{pos={x=5,y=0,z=4}, block="nether:netherrack"},
{pos={x=5,y=0,z=3}, block="nether:netherrack"},
{pos={x=5,y=0,z=2}, block="nether:netherrack"},
{pos={x=5,y=0,z=1}, block="nether:netherrack"},
{pos={x=5,y=0,z=0}, block="nether:netherrack"},
{pos={x=4,y=0,z=0}, block="nether:netherrack"},
{pos={x=3,y=0,z=0}, block="nether:netherrack"},
{pos={x=2,y=0,z=0}, block="nether:netherrack"},
{pos={x=1,y=0,z=0}, block="nether:netherrack"},
-- Floor 2
{pos={x=0,y=1,z=0}, block="nether:netherrack"},
{pos={x=0,y=1,z=1}, block="nether:netherrack"},
{pos={x=0,y=1,z=2}, block="nether:netherrack"},
{pos={x=0,y=1,z=3}, block="nether:netherrack"},
{pos={x=0,y=1,z=4}, block="nether:netherrack"},
{pos={x=0,y=1,z=5}, block="nether:netherrack"},
{pos={x=1,y=1,z=5}, block="nether:netherrack"},
{pos={x=2,y=1,z=5}, block="nether:netherrack"},
{pos={x=3,y=1,z=5}, block="nether:netherrack"},
{pos={x=4,y=1,z=5}, block="nether:netherrack"},
{pos={x=5,y=1,z=5}, block="nether:netherrack"},
{pos={x=0,y=1,z=6}, block="nether:netherrack"},
{pos={x=1,y=1,z=6}, block="nether:netherrack"},
{pos={x=2,y=1,z=6}, block="nether:netherrack"},
{pos={x=3,y=1,z=6}, block="nether:netherrack"},
{pos={x=4,y=1,z=6}, block="nether:netherrack"},
{pos={x=5,y=1,z=6}, block="nether:netherrack"},
{pos={x=5,y=1,z=4}, block="nether:netherrack"},
{pos={x=5,y=1,z=3}, block="nether:netherrack"},
{pos={x=5,y=1,z=2}, block="nether:netherrack"},
{pos={x=5,y=1,z=1}, block="nether:netherrack"},
{pos={x=5,y=1,z=0}, block="nether:netherrack"},
{pos={x=4,y=1,z=0}, block="nether:netherrack"},
{pos={x=3,y=1,z=1}, block="nether:netherrack"},
{pos={x=2,y=1,z=1}, block="nether:netherrack"},
{pos={x=1,y=1,z=0}, block="nether:netherrack"},
{pos={x=1,y=1,z=1}, block="nether:netherrack"},
{pos={x=4,y=1,z=1}, block="nether:netherrack"},
-- Floor 3
{pos={x=0,y=2,z=0}, block="nether:netherrack"},
{pos={x=0,y=2,z=1}, block="nether:netherrack"},
{pos={x=0,y=2,z=2}, block="nether:netherrack"},
{pos={x=0,y=2,z=3}, block="nether:netherrack"},
{pos={x=0,y=2,z=4}, block="nether:netherrack"},
{pos={x=0,y=2,z=5}, block="nether:netherrack"},
{pos={x=1,y=2,z=5}, block="nether:netherrack"},
{pos={x=2,y=2,z=5}, block="nether:netherrack"},
{pos={x=3,y=2,z=5}, block="nether:netherrack"},
{pos={x=4,y=2,z=5}, block="nether:netherrack"},
{pos={x=5,y=2,z=5}, block="nether:netherrack"},
{pos={x=0,y=2,z=6}, block="nether:netherrack"},
{pos={x=1,y=2,z=6}, block="nether:netherrack"},
{pos={x=2,y=2,z=6}, block="nether:netherrack"},
{pos={x=3,y=2,z=6}, block="nether:netherrack"},
{pos={x=4,y=2,z=6}, block="nether:netherrack"},
{pos={x=5,y=2,z=6}, block="nether:netherrack"},
{pos={x=5,y=2,z=4}, block="nether:netherrack"},
{pos={x=5,y=2,z=3}, block="nether:netherrack"},
{pos={x=5,y=2,z=2}, block="nether:netherrack"},
{pos={x=5,y=2,z=1}, block="nether:netherrack"},
{pos={x=5,y=2,z=0}, block="nether:netherrack"},
{pos={x=4,y=2,z=0}, block="nether:netherrack"},
{pos={x=3,y=2,z=2}, block="nether:netherrack"},
{pos={x=2,y=2,z=2}, block="nether:netherrack"},
{pos={x=1,y=2,z=0}, block="nether:netherrack"},
{pos={x=1,y=2,z=1}, block="nether:netherrack"},
{pos={x=4,y=2,z=1}, block="nether:netherrack"},
{pos={x=1,y=2,z=2}, block="nether:netherrack"},
{pos={x=4,y=2,z=2}, block="nether:netherrack"},
-- Floor 4
{pos={x=0,y=3,z=0}, block="nether:netherrack"},
{pos={x=0,y=3,z=1}, block="nether:netherrack"},
{pos={x=0,y=3,z=2}, block="nether:netherrack"},
{pos={x=0,y=3,z=3}, block="nether:netherrack"},
{pos={x=0,y=3,z=4}, block="nether:netherrack"},
{pos={x=0,y=3,z=5}, block="nether:netherrack"},
{pos={x=1,y=3,z=5}, block="nether:netherrack"},
{pos={x=2,y=3,z=5}, block="nether:netherrack"},
{pos={x=3,y=3,z=5}, block="nether:netherrack"},
{pos={x=4,y=3,z=5}, block="nether:netherrack"},
{pos={x=5,y=3,z=5}, block="nether:netherrack"},
{pos={x=0,y=3,z=6}, block="nether:netherrack"},
{pos={x=1,y=3,z=6}, block="nether:netherrack"},
{pos={x=2,y=3,z=6}, block="nether:netherrack"},
{pos={x=3,y=3,z=6}, block="nether:netherrack"},
{pos={x=4,y=3,z=6}, block="nether:netherrack"},
{pos={x=5,y=3,z=6}, block="nether:netherrack"},
{pos={x=5,y=3,z=4}, block="nether:netherrack"},
{pos={x=5,y=3,z=3}, block="nether:netherrack"},
{pos={x=5,y=3,z=2}, block="nether:netherrack"},
{pos={x=5,y=3,z=1}, block="nether:netherrack"},
{pos={x=5,y=3,z=0}, block="nether:netherrack"},
{pos={x=4,y=3,z=0}, block="nether:netherrack"},
{pos={x=3,y=3,z=3}, block="nether:netherrack"},
{pos={x=2,y=3,z=3}, block="nether:netherrack"},
{pos={x=1,y=3,z=0}, block="nether:netherrack"},
{pos={x=1,y=3,z=1}, block="nether:netherrack"},
{pos={x=4,y=3,z=1}, block="nether:netherrack"},
{pos={x=1,y=3,z=2}, block="nether:netherrack"},
{pos={x=4,y=3,z=2}, block="nether:netherrack"},
{pos={x=1,y=3,z=3}, block="nether:netherrack"},
{pos={x=4,y=3,z=3}, block="nether:netherrack"},
{pos={x=1,y=3,z=4}, block="nether:netherrack"},
{pos={x=4,y=3,z=4}, block="nether:netherrack"},
{pos={x=2,y=3,z=4}, block="nether:netherrack"},
{pos={x=2,y=3,z=5}, block="nether:netherrack"},
{pos={x=3,y=3,z=4}, block="nether:netherrack"},
{pos={x=3,y=3,z=5}, block="nether:netherrack"},
-- Floor 5
{pos={x=2,y=4,z=4}, block="nether:netherrack"},
{pos={x=2,y=4,z=5}, block="nether:netherrack"},
{pos={x=3,y=4,z=4}, block="nether:netherrack"},
{pos={x=3,y=4,z=5}, block="nether:netherrack"},
{pos={x=2,y=4,z=6}, block="nether:netherrack"},
{pos={x=3,y=4,z=6}, block="nether:netherrack"},
-- Torches on floor 5
{pos={x=0,y=4,z=4}, block="nether:torch_bottom"},
{pos={x=1,y=4,z=4}, block="nether:torch_bottom"},
{pos={x=0,y=4,z=5}, block="nether:torch_bottom"},
{pos={x=1,y=4,z=5}, block="nether:torch_bottom"},
{pos={x=4,y=4,z=4}, block="nether:torch_bottom"},
{pos={x=5,y=4,z=4}, block="nether:torch_bottom"},
{pos={x=4,y=4,z=5}, block="nether:torch_bottom"},
{pos={x=5,y=4,z=5}, block="nether:torch_bottom"},
{pos={x=0,y=4,z=0}, block="nether:torch_bottom"},
{pos={x=1,y=4,z=0}, block="nether:torch_bottom"},
{pos={x=0,y=4,z=1}, block="nether:torch_bottom"},
{pos={x=1,y=4,z=1}, block="nether:torch_bottom"},
{pos={x=4,y=4,z=0}, block="nether:torch_bottom"},
{pos={x=5,y=4,z=0}, block="nether:torch_bottom"},
{pos={x=4,y=4,z=1}, block="nether:torch_bottom"},
{pos={x=5,y=4,z=1}, block="nether:torch_bottom"},
{pos={x=0,y=4,z=2}, block="nether:torch_bottom"},
{pos={x=1,y=4,z=2}, block="nether:torch_bottom"},
{pos={x=0,y=4,z=3}, block="nether:torch_bottom"},
{pos={x=1,y=4,z=3}, block="nether:torch_bottom"},
{pos={x=4,y=4,z=2}, block="nether:torch_bottom"},
{pos={x=5,y=4,z=2}, block="nether:torch_bottom"},
{pos={x=4,y=4,z=3}, block="nether:torch_bottom"},
{pos={x=5,y=4,z=3}, block="nether:torch_bottom"},
{pos={x=4,y=4,z=6}, block="nether:torch_bottom"},
{pos={x=5,y=4,z=6}, block="nether:torch_bottom"},
{pos={x=0,y=4,z=6}, block="nether:torch_bottom"},
{pos={x=1,y=4,z=6}, block="nether:torch_bottom"},
-- Nether Portal
{pos={x=1,y=5,z=6}, portalblock=true},
}
minetest.register_on_generated(function(minp, maxp, seed)
if minp.y <= 99 then
return
end
local vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
local data = vm:get_data()
local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax}
local perlin1 = minetest.get_perlin(13,3, 0.5, 50) --Get map specific perlin
local perlin2 = minetest.get_perlin(133,3, 0.5, 10)
for x=minp.x, maxp.x, 1 do
for z=minp.z, maxp.z, 1 do
local test = perlin1:get2d({x=x, y=z})+1
local test2 = perlin2:get2d({x=x, y=z})
-- print(test)
if test2 < 0 then
h = 200+math.floor(test2*3+0.5)
else
h = 203+math.floor(test*3+0.5)
end
for y=minp.y, maxp.y, 1 do
p_addpos = area:index(x, y, z)
if y <= h then
data[p_addpos] = c_netherrack
elseif y <= 201 then
data[p_addpos] = c_lava
end
end
end
end
vm:set_data(data)
--vm:set_lighting({day=0, night=0})
vm:calc_lighting()
vm:update_liquids()
vm:write_to_map()
end)
We don't want the Throne of Hades to get regenerated (especially since it will screw up portals)
if (minp.x <= HADES_THRONE_STARTPOS_ABS.x)
and (maxp.x >= HADES_THRONE_STARTPOS_ABS.x)
and (minp.y <= HADES_THRONE_STARTPOS_ABS.y)
and (maxp.y >= HADES_THRONE_STARTPOS_ABS.y)
and (minp.z <= HADES_THRONE_STARTPOS_ABS.z)
and (maxp.z >= HADES_THRONE_STARTPOS_ABS.z)
and (nether:fileexists(HADES_THRONE_GENERATED) == false) then
-- Pass 3: Make way for the Throne of Hades!
for x=(HADES_THRONE_STARTPOS_ABS.x - 1), (HADES_THRONE_ENDPOS_ABS.x + 1), 1 do
for z=(HADES_THRONE_STARTPOS_ABS.z - 1), (HADES_THRONE_ENDPOS_ABS.z + 1), 1 do
-- Notice I did not put a -1 for the beginning. This is because we don't want the throne to float
for y=HADES_THRONE_STARTPOS_ABS.y, (HADES_THRONE_ENDPOS_ABS.y + 1), 1 do
addpos = {x=x, y=y, z=z}
minetest.add_node(addpos, {name="air"})
end
end
end
-- Pass 4: Throne of Hades
for i,v in ipairs(HADES_THRONE_ABS) do
if v.portalblock == true then
NETHER_PORTALS_FROM_NETHER[table.getn(NETHER_PORTALS_FROM_NETHER)+1] = v.pos
nether:save_portal_from_nether(v.pos)
nether:createportal(v.pos)
else
minetest.add_node(v.pos, {name=v.block})
end
end
nether:touch(HADES_THRONE_GENERATED)
end
--[[ Create a nether tree
function nether:grow_nethertree(pos)
--TRUNK
pos.y=pos.y+1
local trunkpos={x=pos.x, z=pos.z}
for y=pos.y, pos.y+4+math.random(2) do
trunkpos.y=y
minetest.add_node(trunkpos, {name="nether:tree"})
end
--LEAVES
local leafpos={}
for x=(trunkpos.x-NETHER_TREESIZE), (trunkpos.x+NETHER_TREESIZE), 1 do
for y=(trunkpos.y-NETHER_TREESIZE), (trunkpos.y+NETHER_TREESIZE), 1 do
for z=(trunkpos.z-NETHER_TREESIZE), (trunkpos.z+NETHER_TREESIZE), 1 do
if (x-trunkpos.x)*(x-trunkpos.x)
+(y-trunkpos.y)*(y-trunkpos.y)
+(z-trunkpos.z)*(z-trunkpos.z)
<= NETHER_TREESIZE*NETHER_TREESIZE + NETHER_TREESIZE then
leafpos={x=x, y=y, z=z}
if minetest.get_node(leafpos).name=="air" then
if math.random(NETHER_APPLE_FREQ) == 1 then
if math.random(NETHER_HEAL_APPLE_FREQ) == 1 then
minetest.add_node(leafpos, {name="default:apple"})
else
minetest.add_node(leafpos, {name="nether:apple"})
end
else
minetest.add_node(leafpos, {name="nether:leaves"})
end
end
end
end
end
end
end]]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 319 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 452 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 572 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 762 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 574 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 612 B

View File

@ -1,166 +0,0 @@
-- Floor 1
{pos={x=0,y=0,z=0}, block="nether:netherrack"},
{pos={x=0,y=0,z=1}, block="nether:netherrack"},
{pos={x=0,y=0,z=2}, block="nether:netherrack"},
{pos={x=0,y=0,z=3}, block="nether:netherrack"},
{pos={x=0,y=0,z=4}, block="nether:netherrack"},
{pos={x=0,y=0,z=5}, block="nether:netherrack"},
{pos={x=1,y=0,z=5}, block="nether:netherrack"},
{pos={x=2,y=0,z=5}, block="nether:netherrack"},
{pos={x=3,y=0,z=5}, block="nether:netherrack"},
{pos={x=4,y=0,z=5}, block="nether:netherrack"},
{pos={x=5,y=0,z=5}, block="nether:netherrack"},
{pos={x=0,y=0,z=6}, block="nether:netherrack"},
{pos={x=1,y=0,z=6}, block="nether:netherrack"},
{pos={x=2,y=0,z=6}, block="nether:netherrack"},
{pos={x=3,y=0,z=6}, block="nether:netherrack"},
{pos={x=4,y=0,z=6}, block="nether:netherrack"},
{pos={x=5,y=0,z=6}, block="nether:netherrack"},
{pos={x=5,y=0,z=4}, block="nether:netherrack"},
{pos={x=5,y=0,z=3}, block="nether:netherrack"},
{pos={x=5,y=0,z=2}, block="nether:netherrack"},
{pos={x=5,y=0,z=1}, block="nether:netherrack"},
{pos={x=5,y=0,z=0}, block="nether:netherrack"},
{pos={x=4,y=0,z=0}, block="nether:netherrack"},
{pos={x=3,y=0,z=0}, block="nether:netherrack"},
{pos={x=2,y=0,z=0}, block="nether:netherrack"},
{pos={x=1,y=0,z=0}, block="nether:netherrack"},
-- Floor 2
{pos={x=0,y=1,z=0}, block="nether:netherrack"},
{pos={x=0,y=1,z=1}, block="nether:netherrack"},
{pos={x=0,y=1,z=2}, block="nether:netherrack"},
{pos={x=0,y=1,z=3}, block="nether:netherrack"},
{pos={x=0,y=1,z=4}, block="nether:netherrack"},
{pos={x=0,y=1,z=5}, block="nether:netherrack"},
{pos={x=1,y=1,z=5}, block="nether:netherrack"},
{pos={x=2,y=1,z=5}, block="nether:netherrack"},
{pos={x=3,y=1,z=5}, block="nether:netherrack"},
{pos={x=4,y=1,z=5}, block="nether:netherrack"},
{pos={x=5,y=1,z=5}, block="nether:netherrack"},
{pos={x=0,y=1,z=6}, block="nether:netherrack"},
{pos={x=1,y=1,z=6}, block="nether:netherrack"},
{pos={x=2,y=1,z=6}, block="nether:netherrack"},
{pos={x=3,y=1,z=6}, block="nether:netherrack"},
{pos={x=4,y=1,z=6}, block="nether:netherrack"},
{pos={x=5,y=1,z=6}, block="nether:netherrack"},
{pos={x=5,y=1,z=4}, block="nether:netherrack"},
{pos={x=5,y=1,z=3}, block="nether:netherrack"},
{pos={x=5,y=1,z=2}, block="nether:netherrack"},
{pos={x=5,y=1,z=1}, block="nether:netherrack"},
{pos={x=5,y=1,z=0}, block="nether:netherrack"},
{pos={x=4,y=1,z=0}, block="nether:netherrack"},
{pos={x=3,y=1,z=1}, block="nether:netherrack"},
{pos={x=2,y=1,z=1}, block="nether:netherrack"},
{pos={x=1,y=1,z=0}, block="nether:netherrack"},
{pos={x=1,y=1,z=1}, block="nether:netherrack"},
{pos={x=4,y=1,z=1}, block="nether:netherrack"},
-- Floor 3
{pos={x=0,y=2,z=0}, block="nether:netherrack"},
{pos={x=0,y=2,z=1}, block="nether:netherrack"},
{pos={x=0,y=2,z=2}, block="nether:netherrack"},
{pos={x=0,y=2,z=3}, block="nether:netherrack"},
{pos={x=0,y=2,z=4}, block="nether:netherrack"},
{pos={x=0,y=2,z=5}, block="nether:netherrack"},
{pos={x=1,y=2,z=5}, block="nether:netherrack"},
{pos={x=2,y=2,z=5}, block="nether:netherrack"},
{pos={x=3,y=2,z=5}, block="nether:netherrack"},
{pos={x=4,y=2,z=5}, block="nether:netherrack"},
{pos={x=5,y=2,z=5}, block="nether:netherrack"},
{pos={x=0,y=2,z=6}, block="nether:netherrack"},
{pos={x=1,y=2,z=6}, block="nether:netherrack"},
{pos={x=2,y=2,z=6}, block="nether:netherrack"},
{pos={x=3,y=2,z=6}, block="nether:netherrack"},
{pos={x=4,y=2,z=6}, block="nether:netherrack"},
{pos={x=5,y=2,z=6}, block="nether:netherrack"},
{pos={x=5,y=2,z=4}, block="nether:netherrack"},
{pos={x=5,y=2,z=3}, block="nether:netherrack"},
{pos={x=5,y=2,z=2}, block="nether:netherrack"},
{pos={x=5,y=2,z=1}, block="nether:netherrack"},
{pos={x=5,y=2,z=0}, block="nether:netherrack"},
{pos={x=4,y=2,z=0}, block="nether:netherrack"},
{pos={x=3,y=2,z=2}, block="nether:netherrack"},
{pos={x=2,y=2,z=2}, block="nether:netherrack"},
{pos={x=1,y=2,z=0}, block="nether:netherrack"},
{pos={x=1,y=2,z=1}, block="nether:netherrack"},
{pos={x=4,y=2,z=1}, block="nether:netherrack"},
{pos={x=1,y=2,z=2}, block="nether:netherrack"},
{pos={x=4,y=2,z=2}, block="nether:netherrack"},
-- Floor 4
{pos={x=0,y=3,z=0}, block="nether:netherrack"},
{pos={x=0,y=3,z=1}, block="nether:netherrack"},
{pos={x=0,y=3,z=2}, block="nether:netherrack"},
{pos={x=0,y=3,z=3}, block="nether:netherrack"},
{pos={x=0,y=3,z=4}, block="nether:netherrack"},
{pos={x=0,y=3,z=5}, block="nether:netherrack"},
{pos={x=1,y=3,z=5}, block="nether:netherrack"},
{pos={x=2,y=3,z=5}, block="nether:netherrack"},
{pos={x=3,y=3,z=5}, block="nether:netherrack"},
{pos={x=4,y=3,z=5}, block="nether:netherrack"},
{pos={x=5,y=3,z=5}, block="nether:netherrack"},
{pos={x=0,y=3,z=6}, block="nether:netherrack"},
{pos={x=1,y=3,z=6}, block="nether:netherrack"},
{pos={x=2,y=3,z=6}, block="nether:netherrack"},
{pos={x=3,y=3,z=6}, block="nether:netherrack"},
{pos={x=4,y=3,z=6}, block="nether:netherrack"},
{pos={x=5,y=3,z=6}, block="nether:netherrack"},
{pos={x=5,y=3,z=4}, block="nether:netherrack"},
{pos={x=5,y=3,z=3}, block="nether:netherrack"},
{pos={x=5,y=3,z=2}, block="nether:netherrack"},
{pos={x=5,y=3,z=1}, block="nether:netherrack"},
{pos={x=5,y=3,z=0}, block="nether:netherrack"},
{pos={x=4,y=3,z=0}, block="nether:netherrack"},
{pos={x=3,y=3,z=3}, block="nether:netherrack"},
{pos={x=2,y=3,z=3}, block="nether:netherrack"},
{pos={x=1,y=3,z=0}, block="nether:netherrack"},
{pos={x=1,y=3,z=1}, block="nether:netherrack"},
{pos={x=4,y=3,z=1}, block="nether:netherrack"},
{pos={x=1,y=3,z=2}, block="nether:netherrack"},
{pos={x=4,y=3,z=2}, block="nether:netherrack"},
{pos={x=1,y=3,z=3}, block="nether:netherrack"},
{pos={x=4,y=3,z=3}, block="nether:netherrack"},
{pos={x=1,y=3,z=4}, block="nether:netherrack"},
{pos={x=4,y=3,z=4}, block="nether:netherrack"},
{pos={x=2,y=3,z=4}, block="nether:netherrack"},
{pos={x=2,y=3,z=5}, block="nether:netherrack"},
{pos={x=3,y=3,z=4}, block="nether:netherrack"},
{pos={x=3,y=3,z=5}, block="nether:netherrack"},
-- Floor 5
{pos={x=2,y=4,z=4}, block="nether:netherrack"},
{pos={x=2,y=4,z=5}, block="nether:netherrack"},
{pos={x=3,y=4,z=4}, block="nether:netherrack"},
{pos={x=3,y=4,z=5}, block="nether:netherrack"},
{pos={x=2,y=4,z=6}, block="nether:netherrack"},
{pos={x=3,y=4,z=6}, block="nether:netherrack"},
-- Torches on floor 5
{pos={x=0,y=4,z=4}, block="nether:nether_torch_bottom"},
{pos={x=1,y=4,z=4}, block="nether:nether_torch_bottom"},
{pos={x=0,y=4,z=5}, block="nether:nether_torch_bottom"},
{pos={x=1,y=4,z=5}, block="nether:nether_torch_bottom"},
{pos={x=4,y=4,z=4}, block="nether:nether_torch_bottom"},
{pos={x=5,y=4,z=4}, block="nether:nether_torch_bottom"},
{pos={x=4,y=4,z=5}, block="nether:nether_torch_bottom"},
{pos={x=5,y=4,z=5}, block="nether:nether_torch_bottom"},
{pos={x=0,y=4,z=0}, block="nether:nether_torch_bottom"},
{pos={x=1,y=4,z=0}, block="nether:nether_torch_bottom"},
{pos={x=0,y=4,z=1}, block="nether:nether_torch_bottom"},
{pos={x=1,y=4,z=1}, block="nether:nether_torch_bottom"},
{pos={x=4,y=4,z=0}, block="nether:nether_torch_bottom"},
{pos={x=5,y=4,z=0}, block="nether:nether_torch_bottom"},
{pos={x=4,y=4,z=1}, block="nether:nether_torch_bottom"},
{pos={x=5,y=4,z=1}, block="nether:nether_torch_bottom"},
{pos={x=0,y=4,z=2}, block="nether:nether_torch_bottom"},
{pos={x=1,y=4,z=2}, block="nether:nether_torch_bottom"},
{pos={x=0,y=4,z=3}, block="nether:nether_torch_bottom"},
{pos={x=1,y=4,z=3}, block="nether:nether_torch_bottom"},
{pos={x=4,y=4,z=2}, block="nether:nether_torch_bottom"},
{pos={x=5,y=4,z=2}, block="nether:nether_torch_bottom"},
{pos={x=4,y=4,z=3}, block="nether:nether_torch_bottom"},
{pos={x=5,y=4,z=3}, block="nether:nether_torch_bottom"},
{pos={x=4,y=4,z=6}, block="nether:nether_torch_bottom"},
{pos={x=5,y=4,z=6}, block="nether:nether_torch_bottom"},
-- Floor 6
{pos={x=2,y=5,z=6}, block="nether:netherrack"},
{pos={x=3,y=5,z=6}, block="nether:netherrack"},
-- Floor 7
{pos={x=2,y=6,z=6}, block="nether:netherrack"},
{pos={x=3,y=6,z=6}, block="nether:netherrack"},

17
nether/.luacheckrc Normal file
View File

@ -0,0 +1,17 @@
read_globals = {
-- Defined by Minetest
"minetest", "vector", "PseudoRandom", "VoxelArea", "ItemStack", "dump",
"string",
-- Mods
"default", "stairs"
}
globals = {"nether"}
ignore = {
"212",
-- Unused argument
"411", "421", "422", "423", "431", "432",
-- Shadowing
}
-- Allow very long lines in guide.lua for the HTML code
files["guide.lua"] = {ignore = {"631"}}

View File

@ -197,7 +197,7 @@ minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv
if not sound_allowed then -- avoid playing the sound multiple times, e.g. when middle mouse click if not sound_allowed then -- avoid playing the sound multiple times, e.g. when middle mouse click
return return
end end
minetest.sound_play("default_wood_footstep", {pos=player:getpos(), gain=0.25}) minetest.sound_play("default_wood_footstep", {pos=player:get_pos(), gain=0.25})
sound_allowed = false sound_allowed = false
minetest.after(0, function() minetest.after(0, function()
sound_allowed = true sound_allowed = true

View File

@ -1,10 +0,0 @@
default
creative?
glow
riesenpilz
stairs
moreblocks?
vector_extras
fence_registration?
function_delayer?
watershed?

View File

@ -257,7 +257,7 @@ minetest.register_abm({
meta:set_float("timedif", timediff-times) meta:set_float("timedif", timediff-times)
for i = 1,times do for _ = 1,times do
for _,name in pairs({ for _,name in pairs({
"fuel_totaltime", "fuel_totaltime",
"fuel_time", "fuel_time",
@ -292,7 +292,7 @@ minetest.register_abm({
inv:add_item("dst", cooked.item) inv:add_item("dst", cooked.item)
-- take stuff from "src" list -- take stuff from "src" list
inv:set_stack("src", 1, aftercooked.items[1]) inv:set_stack("src", 1, aftercooked.items[1])
else --~ else
--print("Could not insert '"..cooked.item:to_string().."'") --print("Could not insert '"..cooked.item:to_string().."'")
end end
meta:set_string("src_time", 0) meta:set_string("src_time", 0)

View File

@ -1,362 +1,238 @@
local cube = minetest.inventorycube -- The content of the guide
-- the content of the guide
local guide_infos = { local guide_infos = {
{ {"Nether Mushroom",
description = "Mushrooms", [[Nether mushrooms can be found on the nether's ground and on Dirty Netherrack. They can be dug by hand.
{"text", "Nether mushrooms can be found on the nether's ground and\n".. <item name=riesenpilz:nether_shroom width=100>
"on netherrack soil, it can be dug by hand."},
{"image", {1, 1, "riesenpilz_nether_shroom_side.png"}}, <my_h2><b>Crafting Items</b></my_h2>
{"y", 0.2}, If we drop a Nether mushroom without holding the fast key, we can split it into its stem and head. We can use them to craft a Nether Mushroom Pickaxe, a Nether Blood Extractor, and an uncooked Nether Pearl.
{"text", "If you drop it without holding the fast key, you can split it into its stem and head:"}, <item name=nether:shroom_head width=100> <item name=nether:shroom_stem width=100>
{"image", {1, 1, "nether_shroom_top.png", 1}},
{"image", {1, 1, "nether_shroom_stem.png"}}, <my_h2><b>Cultivating Mushrooms</b></my_h2>
{"y", 0.1}, We can get more mushrooms using Dirty Netherrack:
{"text", "You can get more mushrooms by using a netherrack soil:\n".. 1. Search a dark place (light level <= 7) and, if necessary, place Netherrack with air above it
"1. search a dark place and, if necessary, place netherrack with air about it\n".. <img name=nether_netherrack.png width=100>
"2. right click with cooked blood onto the netherrack to make it soiled\n".. 2. Right click with Cooked Blood onto the Netherrack to turn it into Dirty Netherrack
"3. right click onto the netherrack soil with a nether mushroom head to add some spores\n".. <item name=nether:hotbed width=100> <img name=nether_netherrack.png^nether_netherrack_soil.png width=100>
"4. dig the mushroom which grew after some time to make place for another one"}, 3. Right click onto the Dirty Netherrack with a Nether mushroom head to add some spores
{"image", {1, 1, "riesenpilz_nether_shroom_side.png", 6, 0.12}}, <item name=nether:shroom_head width=100> <img name=nether_netherrack.png^nether_netherrack_soil.png width=100>
{"y", 1}, 4. Wait
{"image", {1, 1, "nether_netherrack.png^nether_netherrack_soil.png", 1.8}}, 5. Dig the Nether mushroom which grew after some time to make place for another one. After some time new spores need to be added (step 3).
{"image", {1, 1, "nether_hotbed.png", 1.3, -0.4}}, <img name=riesenpilz_nether_shroom_side.png width=100>
{"image", {1, 1, "nether_netherrack.png^nether_netherrack_soil.png", 3.6}}, <img name=nether_netherrack.png^nether_netherrack_soil.png width=100>
{"image", {1, 1, "nether_shroom_top.png", 3.1, -0.5}}, ]]},
{"image", {1, 1, "nether_netherrack.png^nether_netherrack_soil.png", 6}},
{"image", {1, 1, "nether_netherrack.png"}}, {"Blood Structures",
}, [[We can find blood structures on the ground and dig their nodes with the bare hand. They contain four kinds of nodes: Nether Blood Stem, Nether Blood, Nether Blood Head, and Nether Fruit.
{ <item name=nether:blood_stem width=100> <item name=nether:blood width=100> <item name=nether:apple width=100>
description = "Tools", We can craft four Nether Blood Wood nodes with the stem.
{"text", "You can craft 5 kinds of tools in the nether,\n".. <item name=nether:wood width=100>
"which (except the mushroom pick) require sticks to be crafted:"}, The four red blood nodes can be cooked in a furnace and, except Nether Blood Wood, their blood can be extracted with a Nether Blood Extractor.
{"image", {1, 1, "nether_pick_mushroom.png"}},
{"y", 0.1}, <my_h2><b>Nether Fruit</b></my_h2>
{"text", "strength : 1\n".. <item name=nether:apple width=100>
"The mushroom pick needs mushroom stems and heads to be crafted."}, Eating a Nether Fruit decreases life but it might work against hunger and give us blood:
{"image", {1, 1, "nether_pick_wood.png"}}, <item name=nether:blood_extracted width=100>
{"y", 0.1}, If we eat it at the right place inside a portal, we will teleport instead of getting blood.
{"text", "strength : 2\n".. If we drop it without holding the fast key, we can split it into its fruit and leaf:
"The nether wood pick can be crafted with cooked nether blood wood."}, <item name=nether:fruit_leaf width=100> <item name=nether:fruit_no_leaf width=100>
{"image", {1, 1, "nether_axe_netherrack.png", 1.5}}, We can craft a fruit leave block out of 9 fruit leaves
{"image", {1, 1, "nether_shovel_netherrack.png", 3}}, The fruit can be used to craft a nether pearl.
{"image", {1, 1, "nether_sword_netherrack.png", 4.5}}, <item name=nether:fruit_leaves width=100>
{"image", {1, 1, "nether_pick_netherrack.png"}}, A fruit leaves block
{"y", 0.1},
{"text", "strength : 3\n".. <my_h2><b>Cultivating Blood Structures</b></my_h2>
"The red netherrack tools can be crafted with usual netherrack."}, If we dig a Nether vine we get a Nether Blood Child. If this sapling is put in a dark place (light level <= 3) on top of a Nether Blood Head node, it grows into a new blood structure after some time.
{"image", {1, 1, "nether_axe_netherrack_blue.png", 1.5}}, <img name=nether_sapling.png width=100>
{"image", {1, 1, "nether_shovel_netherrack_blue.png", 3}}, <img name=nether_blood.png^nether_blood_side.png width=100>
{"image", {1, 1, "nether_sword_netherrack_blue.png", 4.5}}, ]]},
{"image", {1, 1, "nether_pick_netherrack_blue.png"}},
{"y", 0.1}, {"Tools",
{"text", "strength : 3\n".. [[We can craft five kinds of tools in the nether, which (except the Nether Mushroom Pickaxe) require sticks to be crafted. To obtain Nether Sticks we can use the Nether Blood Extractor.
"The blue netherrack tools can be crafted with blue netherrack."},
{"image", {1, 1, "nether_axe_white.png", 1.5}}, <my_h2><b>Nether Mushroom Pickaxe</b></my_h2>
{"image", {1, 1, "nether_shovel_white.png", 3}}, <item name=nether:pick_mushroom width=100>
{"image", {1, 1, "nether_sword_white.png", 4.5}}, Strength: 1
{"image", {1, 1, "nether_pick_white.png"}}, This pickaxe needs mushroom stems and heads to be crafted.
{"y", 0.1},
{"text", "strength : 3\n".. <my_h2><b>Nether Wood Pickaxe</b></my_h2>
"The siwtonic tools can be crafted with the siwtonic ore."}, <item name=nether:pick_wood width=100>
}, Strength: 2
{ This pickaxe can be crafted with Cooked Nether Blood Wood.
description = "Blood structures",
{"text", "You can find blood structures on the ground and\n".. <my_h2><b>Netherrack Tools</b></my_h2>
"dig their nodes even with the bare hand."}, <item name=nether:axe_netherrack width=100> <item name=nether:shovel_netherrack width=100> <item name=nether:sword_netherrack width=100> <item name=nether:pick_netherrack width=100>
{"y", 0.5}, Strength: 3
{"text", "One contains 4 kinds of blocks :"}, The red Netherrack tools can be crafted with usual Netherrack.
{"image", {1, 1, cube("nether_blood.png"), 1}},
{"image", {1, 1, <my_h2><b>Faster Tools</b></my_h2>
cube("nether_blood_top.png", "nether_blood.png^nether_blood_side.png", "nether_blood.png^nether_blood_side.png"), <item name=nether:axe_netherrack_blue width=100> <item name=nether:shovel_netherrack_blue width=100> <item name=nether:sword_netherrack_blue width=100> <item name=nether:pick_netherrack_blue width=100>
2}}, Strength: 3
{"image", {1, 1, "nether_fruit.png", 3}}, The blue Netherrack tools can be crafted with Blue Netherrack.
{"image", {1, 1, cube("nether_blood_stem_top.png", "nether_blood_stem.png", "nether_blood_stem.png")}},
{"y", 0.1}, <item name=nether:axe_white width=100> <item name=nether:shovel_white width=100> <item name=nether:sword_white width=100> <item name=nether:pick_white width=100>
{"text", "Blood stem, blood, blood head and nether fruit"}, Strength: 3
{"y", 0.1}, The Siwtonic tools can be crafted with the Siwtonic block.
{"text", "You can craft 4 blood wood with the stem :"}, ]]},
{"image", {1, 1, cube("nether_wood.png")}},
{"y", 0.1}, {"Cooking",
{"text", "The 4 blood nodes can be cooked and, except\n".. [[To get a furnace we need to dig at least 8 Netherrack Bricks. They can be found at pyramid-like constructions and require at least a strength 1 nether pickaxe to be dug.
"blood wood, their blood can be extracted."}, To begin cooking things, we can use a mushroom or fruit to power a furnace. After that it is recommended to use cooked blood nodes.
},
{ <my_h2><b>Craft Recipe</b></my_h2>
description = "Fruits", To craft the furnace, we can use the netherrack bricks like cobble:
{"text", "You can find the nether fruits on blood structures\n".. <item name=nether:netherrack_brick width=100> <item name=nether:netherrack_brick width=100> <item name=nether:netherrack_brick width=100>
"and dig them even with the bare hand."}, <item name=nether:netherrack_brick width=100> <img name=nether_transparent.png width=100> <item name=nether:netherrack_brick width=100>
{"image", {1, 1, "nether_fruit.png"}}, <item name=nether:netherrack_brick width=100> <item name=nether:netherrack_brick width=100> <item name=nether:netherrack_brick width=100>
{"text", "Eating it will make you lose life but\n"..
"it might feed you and give you blood :"}, <my_h2><b>Cooking Outputs</b></my_h2>
{"image", {1, 1, "nether_blood_extracted.png"}}, Some nether items can be cooked, for example the Blood Structure's nodes.
{"y", 0.2}, <item name=nether:blood_stem_cooked width=100> <item name=nether:blood_cooked width=100> <item name=nether:blood_top_cooked width=100> <item name=nether:wood_cooked width=100>
{"text", "If you eat it at the right place inside a portal,\n".. Other cookable items are Blood and an item to get a Nether Pearl.
"you will teleport instead of getting blood."}, <item name=nether:hotbed width=100> <item name=nether:pearl width=100>
{"y", 0.2}, ]]},
{"text", "If you drop it without holding the fast key,\n"..
"you can split it into its fruit and leaf:"}, {"Nether Blood Extractor",
{"image", {1, 1, "nether_fruit_leaf.png", 1}}, [[With this extractor we can separate Blood from the Blood Structure's nodes. An alternative way to get Blood is to eat Nether Fruits. The Nether Blood Extractor enables us to obtain a Nether Blood Stem Extracted, which we can craft to (empty) Nether Wood and then to Nether Sticks.
{"image", {1, 1, "nether_fruit_no_leaf.png"}},
{"y", 0.2}, <my_h2><b>Craft Recipe</b></my_h2>
{"text", "Craft a fruit leave block out of 9 fruit leaves\n".. We can craft the Nether Blood Extractor as follows:
"The fruit can be used to craft a nether pearl."}, <item name=nether:netherrack_brick width=100> <item name=nether:blood_top_cooked width=100> <item name=nether:netherrack_brick width=100>
{"image", {1, 1, cube("nether_fruit_leaves.png")}}, <item name=nether:blood_cooked width=100> <item name=nether:shroom_stem width=100> <item name=nether:blood_cooked width=100> <img name=nether_transparent.png width=100> <item name=nether:extractor width=100>
{"y", 0.2}, <item name=nether:netherrack_brick width=100> <item name=nether:blood_stem_cooked width=100> <item name=nether:netherrack_brick width=100>
{"text", "A fruit leaves block"},
}, <my_h2><b>Usage</b></my_h2>
{ We can feed the extractor with Blood to make it separate Blood from neighbouring nodes:
description = "Cooking", 1. Place the Nether Blood Extractor somewhere
{"text", "To get a furnace you need to dig at least 8 netherrack bricks.\n".. 2. Place four or fewer Blood Structure's nodes next to it. Example viewed from the top:
"They can be found at pyramid like constructions and require at least\n".. <img name=nether_transparent.png width=100> <img name=nether_blood_stem_top.png width=100> <img name=nether_transparent.png width=100>
"a strength 1 nether pick to be dug.\n".. <img name=nether_blood.png width=100> <img name=nether_blood_extractor.png width=100> <img name=nether_blood.png width=100>
"To craft the furnace, use the netherrack bricks like cobble:"}, <img name=nether_transparent.png width=100> <img name=nether_blood.png width=100> <img name=nether_transparent.png width=100>
{"image", {0.5, 0.5, cube("nether_netherrack_brick.png"), 0.5}}, 3. Right click the extractor with Blood to power it
{"image", {0.5, 0.5, cube("nether_netherrack_brick.png"), 1}}, <img name=nether_transparent.png width=100> <img name=nether_blood_stem_top_empty.png width=100> <img name=nether_transparent.png width=100>
{"image", {0.5, 0.5, cube("nether_netherrack_brick.png")}}, <img name=nether_blood_empty.png width=100> <img name=nether_blood_extractor.png width=100> <img name=nether_blood_empty.png width=100>
{"image", {0.5, 0.5, cube("nether_netherrack_brick.png"), 1}}, <img name=nether_transparent.png width=100> <img name=nether_blood_empty.png width=100> <img name=nether_transparent.png width=100>
{"image", {0.5, 0.5, cube("nether_netherrack_brick.png")}}, 4. Take the new extracted blood and dig the extracted nodes
{"image", {0.5, 0.5, cube("nether_netherrack_brick.png"), 0.5}}, ]]},
{"image", {0.5, 0.5, cube("nether_netherrack_brick.png"), 1}},
{"image", {0.5, 0.5, cube("nether_netherrack_brick.png")}}, {"Ores and Bricks",
{"y", 0.2}, [[Digging ores requires a pickaxe from the nether of a sufficient strength. Pickaxes from the overworld do not work in general.
{"text", "To begin cooking stuff, you can use a mushroom or fruit.\n"..
"After that it's recommended to use cooked blood nodes."}, <my_h2><b>Strength 1</b></my_h2>
{"y", 0.1}, <item name=glow:stone width=100>
{"text", "Some nether items can be cooked:"}, The Glowing stone can be dug with pickaxes from the overworld or a pickaxe from the nether with a strenght of least one. We can find it on the nether's and nether forest's ceiling and use it for lighting.
{"image", {1, 1, cube("nether_blood_stem_top_cooked.png", "nether_blood_stem_cooked.png", "nether_blood_stem_cooked.png"), 0.35}},
{"image", {1, 1, cube("nether_blood_cooked.png"), 1.6}}, <my_h2><b>Strength 2</b></my_h2>
{"image", {1, 1, <item name=nether:netherrack width=100> <item name=nether:netherrack_tiled width=100> <item name=nether:netherrack_black width=100>
cube("nether_blood_top_cooked.png", "nether_blood_cooked.png^nether_blood_side_cooked.png", "nether_blood_cooked.png^nether_blood_side_cooked.png"), The (red) Netherrack is generated like stone, Tiled Netherrack is generated like coal ore and the Black Netherrack is generated like gravel.
2.9}},
{"image", {1, 1, cube("nether_wood_cooked.png"), 4.3}}, <my_h2><b>Strength 3</b></my_h2>
{"y", 1.2}, <item name=nether:netherrack_blue width=100> <item name=nether:white width=100>
{"text", "Some cooked blood stem, cooked blood,\n".. The Blue Netherrack is generated like diamond ore and the Siwtonic block is generated like mese blocks.
"cooked blood head and cooked blood wood,"},
{"image", {1, 1, "nether_hotbed.png", 0.3}}, <my_h2><b>Bricks</b></my_h2>
{"image", {1, 1, "nether_pearl.png", 2}}, There are three types of Bricks: red, Blue, and Black Netherrack Brick. We can craft them from the corresponding Netherrack nodes and additionally, the (red) Netherrack Brick is generated in pyramid-like structures in the nether. In comparison to the Netherrack nodes, all three Bricks can be dug with a pickaxe with strength 1.
{"y", 1.2}, <item name=nether:netherrack_brick width=100> <item name=nether:netherrack_brick_blue width=100> <item name=nether:netherrack_brick_black width=100>
{"text", "Some cooked extracted blood and a nether pearl"}, ]]},
},
{ {"Nether Vines",
description = "Extractors", [[Nether vines are at the ceiling of the nether and can be dug by hand. They drop Nether Blood Child nodes, from which we can grow Blood Structures. By feeding Blood to a Nether vine with air beneath it, it grows one node.
{"text", "Here you can find out information about the nether extractor."}, <item name=nether:vine width=100>
{"y", 0.2}, ]]},
{"text", "Here you can see its craft recipe:"},
{"image", {0.5, 0.5, cube("nether_blood_top_cooked.png", "nether_blood_cooked.png^nether_blood_side_cooked.png", "nether_blood_cooked.png^nether_blood_side_cooked.png"), 0.5}}, {"Portals",
{"image", {0.5, 0.5, cube("nether_netherrack_brick.png"), 1}}, [[This nether mod supports two types of portals: the well-known Minecraft-like one made of Obsidian, and a portal which is specific to this mod. The Obsidian portal allows us to reach the nether from the overworld, but it is one-way and kills us.
{"image", {0.5, 0.5, cube("nether_netherrack_brick.png")}},
{"image", {0.5, 0.5, cube("nether_blood_extractor.png"), 2.5}}, <my_h2><b>Build Instructions</b></my_h2>
{"image", {0.5, 0.5, "nether_shroom_stem.png", 0.5}}, A nether portal requires the following nodes:
{"image", {0.5, 0.5, cube("nether_blood_cooked.png"), 1}}, <item name=nether:wood_empty width=100> <item name=nether:netherrack_black width=100> <item name=nether:netherrack_brick_blue width=100> <item name=nether:netherrack width=100> <item name=nether:blood_cooked width=100> <item name=nether:apple width=100> <item name=nether:white width=100>
{"image", {0.5, 0.5, cube("nether_blood_cooked.png")}}, * 25 (empty) Nether Wood (height 5-6)
{"image", {0.5, 0.5, cube("nether_blood_stem_top_cooked.png", "nether_blood_stem_cooked.png", "nether_blood_stem_cooked.png"), 0.5}}, * 16 Black Netherrack (height 1)
{"image", {0.5, 0.5, cube("nether_netherrack_brick.png"), 1}}, * 12 Blue Netherrack Bricks (height 2-4)
{"image", {0.5, 0.5, cube("nether_netherrack_brick.png")}}, * 8 (red) Netherrack (height 1)
{"y", 0.2}, * 8 Cooked Nether Blood (height 5)
{"text", "Extract blood from the blood nodes you get from the blood structures.\n".. * 4 Nether Fruits (height 4)
"You can also get blood with a nether fruit."}, * 2 Siwtonic blocks (height 1 and 5)
{"y", 0.2},
{"text", "So you can use it:\n".. The heights in parenthesis correspond to the relative vertical positions of the nodes. When built, the portal should look approximately like this one:
"1. place it somewhere\n".. <img name=nether_teleporter.png width=600>
"2. place blood blocks next to it (4 or less)\n"..
"3. right click with extracted blood onto it to power it\n".. <my_h2><b>Usage</b></my_h2>
"4. take the new extracted blood and dig the extracted nodes"}, Before using the portal the first time, we may want to fill our inventory with enough items so that we can build a second portal on the overworld to get back.
{"y", 0.2}, We can activate the portal as follows:
{"text", "Example (view from the top):"}, 1. Stand in the middle on the Siwtonic block
{"y", 0.88}, 2. Eat a Nether Fruit. If the portal was built correctly, we can hear a special sound and are teleported to the overworld.
{"image", {1, 1, "nether_blood_stem_top.png", 0.82, -0.88}},
{"image", {1, 1, "nether_blood.png", 1.63}}, If two portals in the nether and overworld have the same X and Z coordinates, they teleport us to the centre, i.e. onto the Siwtonic block, of the opposite portal when eating a Nether Fruit.
{"image", {1, 1, "nether_blood_extractor.png", 0.82}}, ]]},
{"image", {1, 1, "nether_blood_stem_top_empty.png", 3.82, -0.88}},
{"image", {1, 1, "nether_blood_empty.png", 4.63}}, {"Pearls",
{"image", {1, 1, "nether_blood_empty.png", 3.001}}, [[The nether pearl can be used to teleport by throwing it.
{"image", {1, 1, "nether_blood_extractor.png", 3.82}},
{"image", {1, 1, "nether_blood.png"}}, <my_h2><b>Craft Recipe</b></my_h2>
{"image", {1, 1, "nether_blood.png", 0.82, -0.12}}, First, we need to craft two Nether Mushroom Heads and a Nether Fruit Without Leaf together as follows:
{"image", {1, 1, "nether_blood_empty.png", 3.82, -0.12}}, <item name=nether:shroom_head width=100>
{"y", 1.2}, <item name=nether:fruit_no_leaf width=100>
{"text", "The empty blood stem can be crafted into empty nether wood,\n".. <item name=nether:shroom_head width=100>
"which can be crafted into nether sticks."}, This gives us the Nether Fruit in Mushroom (FIM), which we can cook in a furnace to obtain a Nether Pearl.
}, <item name=nether:fim width=100> <item name=nether:pearl width=100>
{ ]]},
description = "Ores",
{"text", "You can find 5 types of ores:"}, {"Nether Forest",
{"image", {1, 1, cube("nether_netherrack_black.png"), 4}}, [[The nether forest is generated in caves above the nether and contains decorative plants.
{"image", {1, 1, cube("nether_netherrack.png")}},
{"y", 0.2}, <my_h2><b>Grass and Flower</b></my_h2>
{"text", "The red netherrack is generated like stone.\n".. <item name=nether:grass_big width=100> <item name=nether:grass_middle width=100> <item name=nether:grass_small width=100>
"The black netherrack is generated like gravel.\n".. We can craft the Nether Grass item to another grass item, which can be cooked to get Dried Nether Grass. We can then craft this dried grass to paper.
"Both require at least a strength 2 nether pick to be dug."},
{"image", {1, 1, cube("nether_white.png"), 4}}, <item name=nether:glowflower width=100>
{"image", {1, 1, cube("nether_netherrack_blue.png")}}, The Glowing Flower can be used for lighting and decoration.
{"y", 0.2},
{"text", "The blue netherrack is generated like diamond ore.\n".. <my_h2><b>Nether Tree</b></my_h2>
"The siwtonic ore is generated like mese blocks.\n".. <item name=nether:tree width=100>
"Both require at least a strength 3 nether pick to be dug."}, Nether trunks can be found at Nether Trees and be crafted into Nether Wood Blocks via Nether Wood Planks. Furthermore, the Nether Tree Saplings grow even in the overworld if they have Nether Dirt beneath them.
{"image", {1, 1, cube("nether_netherrack_tiled.png"), 4}}, ]]}
{"image", {1, 1, cube("glow_stone.png")}},
{"y", 0.2},
{"text", "Glow stone can be used for lighting.\n"..
"Tiled netherrack is generated like coal ore.\n"..
"Glow stone requires at least a strength 1 pick to be dug.\n"..
"Dig tiled netherrack with at least a level 2 pickaxe."},
},
{
description = "Vines",
{"text", "Feed nether vines with blood.\n"..
"Dig them with anything."},
{"image", {1, 1, "nether_vine.png"}},
{"y", 0.2},
{"text", "Grow nether child by placing\n"..
"placing it to a dark place onto a\n"..
"blood structure head node."},
{"image", {1, 1, "nether_sapling.png"}},
{"y", -0.10},
{"image", {1, 1, "nether_blood.png^nether_blood_side.png"}},
},
{
description = "Pearls",
{"text", "The nether pearl can be used to teleport by throwing it.\n"..
"Here is how to get one :"},
{"y", 0.2},
{"text", "First of all craft 2 mushroom heads and 1 nether fruit\n"..
"without leaf together :"},
{"image", {1, 1, "nether_shroom_top.png"}},
{"image", {1, 1, "nether_fim.png", 3}},
{"image", {1, 1, "nether_fruit_no_leaf.png"}},
{"image", {1, 1, "nether_shroom_top.png"}},
{"y", 0.2},
{"text", "Put the result into the furnace\n"..
"to cook it into a nether pearl :"},
{"image", {1, 1, "nether_pearl.png"}},
},
{
description = "Bricks",
{"text", "Craft bricks out of red,\n"..
"black and blue netherrack."},
{"image", {1, 1, cube("nether_netherrack_brick_black.png"), 1}},
{"image", {1, 1, cube("nether_netherrack_brick_blue.png"), 2}},
{"image", {1, 1, cube("nether_netherrack_brick.png")}},
{"y", 0.4},
{"text", "Dig them with at least a level 1 pickaxe."},
{"y", 0.2},
},
{
description = "Portals",
{"text", "Here you can find out how to built the nether portal."},
{"y", 0.3},
{"text", "A nether portal requires following nodes:"},
{"y", 0.05},
{"text", "25 empty nether wooden planks\n"..
"16 black netherrack\n"..
"12 blue netherrack bricks\n"..
"8 red netherrack\n"..
"8 cooked nether blood\n"..
"4 nether fruits\n"..
"2 siwtonic blocks"},
{"y", 0.2},
{"text", "It should look approximately like this one:"},
{"image", {5.625, 6, "nether_teleporter.png", 0, -1.5}},
{"y", 5.5},
{"text", "Activate it by standing in the middle,\n"..
"on the siwtonic block and eating a nether fruit.\n"..
"Take enough stuff with you to build a portal when you'll come back."},
},
{
description = "Forests",
{"text", "The nether forest is generated in caves,\n"..
"above the usual nether."},
{"y", 0.2},
{"text", "There you can find some plants:"},
{"image", {1, 1, "nether_grass_middle.png", 1}},
{"image", {1, 1, "nether_grass_big.png", 2}},
{"image", {1, 1, "nether_grass_small.png"}},
{"y", 0.2},
{"text", "Use the nether forest grass to get paper.\n"..
"Craft paper out of the dried grass."},
{"image", {1, 1, cube("nether_tree_top.png", "nether_tree.png", "nether_tree.png")}},
{"y", 0.2},
{"text", "Nether trunks can be found at nether trees.\n"..
"Craft nether wood out of nether trunk."},
{"image", {1, 1, "nether_glowflower.png"}},
{"y", 0.2},
{"text", "Use it for lighting and decoration."},
},
} }
-- the size of guide pages -- The guide formspecs
local guide_size = {x=40, y=10, cx=0.2, cy=0.2} local guide_forms = {}
-- informations about settings and ... -- Convert the guide content to formspecs
local formspec_offset = {x=0.25, y=0.50}
local font_size
if minetest.is_singleplayer() then
font_size = tonumber(minetest.settings:get("font_size")) or 13
else
font_size = 13
end
guide_size.fx = math.floor((40*(guide_size.cx+formspec_offset.x))*font_size)
guide_size.fy = font_size/40
-- the default guide formspecs
local guide_forms = {
contents = "size[3.6,"..(#guide_infos)-2 ..";]label["..guide_size.cx+0.7 ..","..guide_size.cy+0.2 ..";Contents:]",
}
-- change the infos to formspecs
for n,data in ipairs(guide_infos) do for n,data in ipairs(guide_infos) do
local form = "" local title, html_content = data[1], data[2]
local y = 0 --~ local html_text = "<global background=#242424 size=24><tag name=my_h1 size=35>" ..
local x = guide_size.cx local html_text = "<global size=24><tag name=my_h1 size=35>" ..
for _,i in ipairs(data) do "<tag name=my_h2 size=30>" ..
local typ, content = unpack(i) "<my_h1><b><center>" .. title .. "</b></center></my_h1>\n" ..
if typ == "y" then html_content
y = y+content local spec_width = 16
elseif typ == "x" then local spec_height = 16
x = math.max(x, content) local html_padding = 0.5
elseif typ == "text" then local form = ("formspec_version[4]size[%g,%g;]" ..
local tab = minetest.wrap_text(content, guide_size.fx, true) "hypertext[%g,%g;%g,%g;html;%s]button[%g,%g;2,0.8;quit;Back]"
local l = guide_size.cx ):format(
for _,str in ipairs(tab) do spec_width, spec_height,
form = form.."label["..guide_size.cx ..","..guide_size.cy+y..";"..str.."]" html_padding, html_padding,
y = y+guide_size.fy spec_width - 2 * html_padding, spec_height - 1 - 2 * html_padding,
l = math.max(l, #str) minetest.formspec_escape(html_text),
end 0.5 * spec_width - 1, spec_height - 1)
x = math.max(x, l/font_size)
elseif typ == "image" then guide_forms[n] = {title, form}
local w, h, texture_name, px, py = unpack(content)
if not px then
form = form.."image["..guide_size.cx..","..guide_size.cy+y+h*0.3 ..";"..w..","..h..";"..texture_name.."]"
y = y+h
else
px = guide_size.cx+px
py = py or 0
form = form.."image["..px..","..
guide_size.cy+y+h*0.3+py ..";"..w..","..h..";"..texture_name.."]"
x = math.max(x, px+w)
end
end
end
form = "size["..x*1.8 ..","..y+1 ..";]"..form.."button["..x/2-0.5 ..","..y ..";1,2;quit;Back]"
guide_forms[n] = {data.description, form}
end end
local desc_tab = {} local title_to_index = {}
for n,i in ipairs(guide_forms) do for n, i in ipairs(guide_forms) do
desc_tab[i[1]] = n title_to_index[i[1]] = n
end end
-- creates contents formspec -- Create the contents formspec
local y = 0 guide_forms.contents = "formspec_version[4]size[6," .. (#guide_infos) + 2 ..
for y,i in ipairs(guide_forms) do ";]label[2,0.8;Contents:]"
local desc, form = unpack(i) for i, data in ipairs(guide_forms) do
local s = #desc*1.3/font_size+1.5 local desc = data[1]
guide_forms.contents = guide_forms.contents.."button["..guide_size.cx*12/s-0.5 ..","..guide_size.cy+y/1.3 ..";"..s..",1;name;"..desc.."]" local y = i + 0.5 + 0.1
end guide_forms.contents = guide_forms.contents ..
"button[0.5," .. y .. ";5,0.8;name;" .. desc .. "]"
-- shows the contents of the formspec
local function show_guide(pname)
minetest.show_formspec(pname, "nether_guide_contents", guide_forms["contents"])
end end
minetest.register_on_player_receive_fields(function(player, formname, fields) minetest.register_on_player_receive_fields(function(player, formname, fields)
@ -365,14 +241,16 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
local pname = player:get_player_name() local pname = player:get_player_name()
if fname if fname
and pname then and pname then
minetest.show_formspec(pname, "nether_guide", guide_forms[desc_tab[fname]][2]) minetest.show_formspec(pname, "nether_guide",
guide_forms[title_to_index[fname]][2])
end end
elseif formname == "nether_guide" then elseif formname == "nether_guide" then
local fname = fields.quit local fname = fields.quit
local pname = player:get_player_name() local pname = player:get_player_name()
if fname if fname
and pname then and pname then
minetest.show_formspec(pname, "nether_guide_contents", guide_forms["contents"]) minetest.show_formspec(pname, "nether_guide_contents",
guide_forms["contents"])
end end
end end
end) end)
@ -383,15 +261,16 @@ minetest.register_chatcommand("nether_help", {
func = function(name) func = function(name)
local player = minetest.get_player_by_name(name) local player = minetest.get_player_by_name(name)
if not player then if not player then
minetest.chat_send_player(name, "Something went wrong.") return false, "Something went wrong."
return false
end end
if player:getpos().y > nether.start then if not nether.overworld_help and player:get_pos().y > nether.start then
minetest.chat_send_player(name, "Usually you don't neet this guide here. You can view it in the nether.") return false, "Usually you don't neet this guide here. " ..
return false "You can view it in the nether."
end end
minetest.chat_send_player(name, "Showing guide...") minetest.chat_send_player(name, "Showing guide...")
show_guide(name) -- Show the Contents (overview) page
minetest.show_formspec(name, "nether_guide_contents",
guide_forms["contents"])
return true return true
end end
}) })

View File

@ -19,15 +19,6 @@ end
--== EDITABLE OPTIONS ==-- --== EDITABLE OPTIONS ==--
--says some information.
nether.info = true
-- tell everyone about the generation
nether.inform_all = minetest.is_singleplayer()
--1:<a bit of information> 2:<acceptable amount of information> 3:<lots of text>
nether.max_spam = 2
-- Depth of the nether -- Depth of the nether
local nether_middle = -20000 local nether_middle = -20000
@ -62,7 +53,7 @@ nether.start = f_h_max+100
local NETHER_HEIGHT = 30 local NETHER_HEIGHT = 30
-- Maximum amount of randomness in the map generation -- Maximum amount of randomness in the map generation
NETHER_RANDOM = 2 local NETHER_RANDOM = 2
-- Frequency of Glowstone on the "roof" of the Nether (higher is less frequent) -- Frequency of Glowstone on the "roof" of the Nether (higher is less frequent)
local GLOWSTONE_FREQ_ROOF = 500 local GLOWSTONE_FREQ_ROOF = 500
@ -94,9 +85,17 @@ local NETHER_SHROOM_FREQ = 100
--== END OF EDITABLE OPTIONS ==-- --== END OF EDITABLE OPTIONS ==--
if nether.info then local path = minetest.get_modpath"nether"
dofile(path .. "/settings.lua")
local nether_weird_noise = dofile(path .. "/weird_mapgen_noise.lua")
dofile(path .. "/items.lua")
--dofile(path .. "/furnace.lua")
dofile(path .. "/pearl.lua")
if nether.log_level >= 1 then
function nether:inform(msg, spam, t) function nether:inform(msg, spam, t)
if spam <= self.max_spam then if spam <= self.log_level then
local info local info
if t then if t then
info = "[nether] " .. msg .. (" after ca. %.3g s"):format( info = "[nether] " .. msg .. (" after ca. %.3g s"):format(
@ -105,7 +104,7 @@ if nether.info then
info = "[nether] " .. msg info = "[nether] " .. msg
end end
print(info) print(info)
if self.inform_all then if self.log_to_chat then
minetest.chat_send_all(info) minetest.chat_send_all(info)
end end
end end
@ -116,12 +115,6 @@ else
end end
local path = minetest.get_modpath"nether"
dofile(path.."/weird_mapgen_noise.lua")
dofile(path.."/items.lua")
--dofile(path.."/furnace.lua")
dofile(path.."/pearl.lua")
-- Weierstrass function stuff from https://github.com/slemonide/gen -- Weierstrass function stuff from https://github.com/slemonide/gen
local SIZE = 1000 local SIZE = 1000
local ssize = math.ceil(math.abs(SIZE)) local ssize = math.ceil(math.abs(SIZE))
@ -391,18 +384,18 @@ minetest.register_on_generated(function(minp, maxp, seed)
map_lengths_xyz), map_lengths_xyz),
} }
end end
pelin_maps.a:get2dMap_flat({x=minp.x, y=minp.z}, pmap1) pelin_maps.a:get_2d_map_flat({x=minp.x, y=minp.z}, pmap1)
pelin_maps.b:get2dMap_flat({x=minp.x, y=minp.z}, pmap2) pelin_maps.b:get_2d_map_flat({x=minp.x, y=minp.z}, pmap2)
pelin_maps.c:get2dMap_flat({x=minp.x, y=minp.z}, pmap3) pelin_maps.c:get_2d_map_flat({x=minp.x, y=minp.z}, pmap3)
local forest_possible = maxp.y > f_h_min and minp.y < f_h_max local forest_possible = maxp.y > f_h_min and minp.y < f_h_max
--local pmap_f_bottom = minetest.get_perlin_map(perlins.forest_bottom, --local pmap_f_bottom = minetest.get_perlin_map(perlins.forest_bottom,
-- map_lengths_xyz):get2dMap_flat({x=minp.x, y=minp.z}) -- map_lengths_xyz):get_2d_map_flat({x=minp.x, y=minp.z})
local perlin_f_bottom, strassx, strassz local perlin_f_bottom, strassx, strassz
if forest_possible then if forest_possible then
perlin_f_bottom = minetest.get_perlin(11, 3, 0.8, tmp2) perlin_f_bottom = minetest.get_perlin(11, 3, 0.8, tmp2)
pelin_maps.forest_top:get2dMap_flat({x=minp.x, y=minp.z}, pmap_f_top) pelin_maps.forest_top:get_2d_map_flat({x=minp.x, y=minp.z}, pmap_f_top)
strassx = get_ws_list(2, minp.x) strassx = get_ws_list(2, minp.x)
strassz = get_ws_list(2, minp.z) strassz = get_ws_list(2, minp.z)
end end
@ -485,7 +478,7 @@ minetest.register_on_generated(function(minp, maxp, seed)
local pstr = p.x.." "..p.z local pstr = p.x.." "..p.z
if not f_perlins[pstr] then if not f_perlins[pstr] then
f_perlins[pstr] = math.floor(f_h_min + (math.abs( f_perlins[pstr] = math.floor(f_h_min + (math.abs(
perlin_f_bottom:get2d{x=p.x, y=p.z} + 1)) perlin_f_bottom:get_2d{x=p.x, y=p.z} + 1))
* f_yscale_bottom + 0.5) * f_yscale_bottom + 0.5)
end end
local top_noise = pmap_f_top[count]+1 local top_noise = pmap_f_top[count]+1
@ -1042,5 +1035,5 @@ local msg = ("[nether] loaded after ca. %g seconds."):format(time)
if time > 0.01 then if time > 0.01 then
print(msg) print(msg)
else else
minetest.log("action", msg) minetest.log("info", msg)
end end

View File

@ -4,25 +4,20 @@ local nether_sound = default.node_sound_stone_defaults({
footstep = {name="nether_footstep", gain=0.4} footstep = {name="nether_footstep", gain=0.4}
}) })
-- The fence registration function from fence_registration
local add_fence = minetest.register_fence local add_fence = minetest.register_fence
local stairs_exist = minetest.global_exists("stairs")
-- A function which registers a fence and stairs nodes for a nether node if the
-- mods for these node registrations are available
local function add_more_nodes(name) local function add_more_nodes(name)
local nd = "nether:"..name local nd = "nether:"..name
if not string.find(name, "nether") then if not string.find(name, "nether") then
name = "nether_"..name name = "nether_"..name
end end
local data = minetest.registered_nodes[nd] local data = minetest.registered_nodes[nd]
if stairsplus then if stairs_exist then
stairsplus:register_all( stairs.register_stair_and_slab(name, nd,
"nether",
name,
nd,
data
)
minetest.register_alias("stairs:stair_"..name, "nether"..":stair_"..name)
minetest.register_alias("stairs:slab_"..name, "nether"..":slab_"..name)
else
stairs.register_stair_and_slab(
name, nd,
data.groups, data.groups,
data.tiles, data.tiles,
data.description.." Stair", data.description.." Stair",
@ -47,17 +42,16 @@ local function add_fence(name)
end end
--]] --]]
local creative_installed = minetest.global_exists("creative")
local function digging_allowed(player, v) local function digging_allowed(player, v)
if not player then if not player then
return false return false
end end
if creative_installed and creative.is_enabled_for(player:get_player_name()) then if minetest.is_creative_enabled(player:get_player_name()) then
return true return true
end end
local tool = player:get_wielded_item():get_name() local tool = player:get_wielded_item():get_name()
tool = minetest.registered_tools[tool] or tool == "" and minetest.registered_items[tool] tool = minetest.registered_tools[tool] or tool == ""
and minetest.registered_items[tool]
if not tool if not tool
or not tool.tool_capabilities then or not tool.tool_capabilities then
return false return false
@ -222,7 +216,8 @@ add_more_nodes("blood_empty")
minetest.register_node("nether:blood_top", { minetest.register_node("nether:blood_top", {
description = "Nether Blood Head", description = "Nether Blood Head",
tiles = {"nether_blood_top.png", "nether_blood.png", "nether_blood.png^nether_blood_side.png"}, tiles = {"nether_blood_top.png", "nether_blood.png",
"nether_blood.png^nether_blood_side.png"},
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=1}, groups = {snappy=2, choppy=2, oddly_breakable_by_hand=1},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
}) })
@ -230,7 +225,8 @@ add_more_nodes("blood_top")
minetest.register_node("nether:blood_top_cooked", { minetest.register_node("nether:blood_top_cooked", {
description = "Cooked Nether Blood Head", description = "Cooked Nether Blood Head",
tiles = {"nether_blood_top_cooked.png", "nether_blood_cooked.png", "nether_blood_cooked.png^nether_blood_side_cooked.png"}, tiles = {"nether_blood_top_cooked.png", "nether_blood_cooked.png",
"nether_blood_cooked.png^nether_blood_side_cooked.png"},
groups = {nether=3}, groups = {nether=3},
sounds = nether_sound, sounds = nether_sound,
furnace_burntime = 10, furnace_burntime = 10,
@ -242,7 +238,8 @@ add_more_nodes("blood_top_cooked")
minetest.register_node("nether:blood_top_empty", { minetest.register_node("nether:blood_top_empty", {
description = "Nether Blood Head Extracted", description = "Nether Blood Head Extracted",
tiles = {"nether_blood_top_empty.png", "nether_blood_empty.png", "nether_blood_empty.png^nether_blood_side_empty.png"}, tiles = {"nether_blood_top_empty.png", "nether_blood_empty.png",
"nether_blood_empty.png^nether_blood_side_empty.png"},
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=1}, groups = {snappy=2, choppy=2, oddly_breakable_by_hand=1},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
}) })
@ -251,7 +248,8 @@ add_more_nodes("blood_top_empty")
minetest.register_node("nether:blood_stem", { minetest.register_node("nether:blood_stem", {
description = "Nether Blood Stem", description = "Nether Blood Stem",
tiles = {"nether_blood_stem_top.png", "nether_blood_stem_top.png", "nether_blood_stem.png"}, tiles = {"nether_blood_stem_top.png", "nether_blood_stem_top.png",
"nether_blood_stem.png"},
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=1}, groups = {snappy=2, choppy=2, oddly_breakable_by_hand=1},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
}) })
@ -259,7 +257,8 @@ add_more_nodes("blood_stem")
minetest.register_node("nether:blood_stem_cooked", { minetest.register_node("nether:blood_stem_cooked", {
description = "Cooked Nether Blood Stem", description = "Cooked Nether Blood Stem",
tiles = {"nether_blood_stem_top_cooked.png", "nether_blood_stem_top_cooked.png", "nether_blood_stem_cooked.png"}, tiles = {"nether_blood_stem_top_cooked.png",
"nether_blood_stem_top_cooked.png", "nether_blood_stem_cooked.png"},
groups = {nether=3}, groups = {nether=3},
sounds = nether_sound, sounds = nether_sound,
furnace_burntime = 30, furnace_burntime = 30,
@ -271,7 +270,8 @@ add_more_nodes("blood_stem_cooked")
minetest.register_node("nether:blood_stem_empty", { minetest.register_node("nether:blood_stem_empty", {
description = "Nether Blood Stem Extracted", description = "Nether Blood Stem Extracted",
tiles = {"nether_blood_stem_top_empty.png", "nether_blood_stem_top_empty.png", "nether_blood_stem_empty.png"}, tiles = {"nether_blood_stem_top_empty.png",
"nether_blood_stem_top_empty.png", "nether_blood_stem_empty.png"},
groups = {tree=1, choppy=2, oddly_breakable_by_hand=1}, groups = {tree=1, choppy=2, oddly_breakable_by_hand=1},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
}) })
@ -363,7 +363,10 @@ minetest.override_item("riesenpilz:nether_shroom", {
minetest.register_node("nether:apple", { minetest.register_node("nether:apple", {
description = "Nether Fruit", description = "Nether Fruit",
drawtype = "nodebox", drawtype = "nodebox",
tiles = {"nether_fruit_top.png", "nether_fruit_bottom.png", "nether_fruit.png", "nether_fruit.png^[transformFX", "nether_fruit.png^[transformFX", "nether_fruit.png"}, tiles = {"nether_fruit_top.png", "nether_fruit_bottom.png",
"nether_fruit.png", "nether_fruit.png^[transformFX",
"nether_fruit.png^[transformFX", "nether_fruit.png"},
use_texture_alpha = "opaque",
node_box = { node_box = {
type = "fixed", type = "fixed",
fixed = { fixed = {
@ -391,7 +394,7 @@ minetest.register_node("nether:apple", {
return return
end end
itemstack:take_item() itemstack:take_item()
if nether_port(user, vector.round(user:getpos())) then if nether.teleport_player(user) then
return itemstack return itemstack
end end
local amount = math.random(4, 6) local amount = math.random(4, 6)
@ -518,8 +521,10 @@ minetest.register_node("nether:tree", {
minetest.register_node("nether:tree_corner", { minetest.register_node("nether:tree_corner", {
description = "Nether Trunk Corner", description = "Nether Trunk Corner",
tiles = {"nether_tree.png^[transformR180", "nether_tree_top.png", "nether_tree_corner.png^[transformFY", tiles = {"nether_tree.png^[transformR180", "nether_tree_top.png",
"nether_tree_corner.png^[transformR180", "nether_tree.png", "nether_tree_top.png"}, "nether_tree_corner.png^[transformFY",
"nether_tree_corner.png^[transformR180", "nether_tree.png",
"nether_tree_top.png"},
paramtype2 = "facedir", paramtype2 = "facedir",
is_ground_content = false, is_ground_content = false,
groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,not_in_creative_inventory=1}, groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,not_in_creative_inventory=1},
@ -540,7 +545,7 @@ minetest.register_node("nether:leaves", {
description = "Nether Leaves", description = "Nether Leaves",
drawtype = "plantlike", drawtype = "plantlike",
waving = 1, waving = 1,
visual_scale = math.sqrt(math.sqrt(2)), visual_scale = math.sqrt(2) + 0.01,
tiles = {"nether_leaves.png"}, tiles = {"nether_leaves.png"},
inventory_image = "nether_leaves.png", inventory_image = "nether_leaves.png",
wield_image = "nether_leaves.png", wield_image = "nether_leaves.png",
@ -641,7 +646,7 @@ minetest.register_node("nether:portal", {
light_source = 12, light_source = 12,
paramtype = "light", paramtype = "light",
sunlight_propagates = true, sunlight_propagates = true,
use_texture_alpha = true, use_texture_alpha = "blend",
walkable = false, walkable = false,
pointable = false, pointable = false,
buildable_to = false, buildable_to = false,

3
nether/mod.conf Normal file
View File

@ -0,0 +1,3 @@
name = nether
depends = default,glow,riesenpilz
optional_depends = creative,fence_registration,function_delayer,stairs,watershed

View File

@ -1,22 +1,14 @@
local function table_contains(t, v)
for _,i in pairs(t) do
if v == i then
return true
end
end
return false
end
local creative = minetest.settings:get_bool("creative_mode")
local function throw_pearl(item, player) local function throw_pearl(item, player)
local playerpos = player:getpos() local playerpos = player:get_pos()
playerpos.y = playerpos.y+1.625 playerpos.y = playerpos.y+1.625
local obj = minetest.add_entity(playerpos, "nether:pearl_entity") local obj = minetest.add_entity(playerpos, "nether:pearl_entity")
local dir = player:get_look_dir() local dir = player:get_look_dir()
obj:setvelocity(vector.multiply(dir, 30)) obj:set_velocity(vector.multiply(dir, 30))
obj:setacceleration({x=dir.x*-3, y=-dir.y^8*80-10, z=dir.z*-3}) obj:set_acceleration({x=dir.x*-3, y=-dir.y^8*80-10, z=dir.z*-3})
obj:get_luaentity().player = player:get_player_name() local pname = player:get_player_name()
if not creative then obj:get_luaentity().player = pname
if not minetest.is_creative_enabled(pname) then
item:take_item() item:take_item()
return item return item
end end
@ -64,7 +56,7 @@ local function teleport_player(pos, player)
return false return false
end end
pos.y = pos.y+0.05 pos.y = pos.y+0.05
player:moveto(pos) player:move_to(pos)
return true return true
end end
@ -107,7 +99,7 @@ minetest.register_entity("nether:pearl_entity", {
self.player = tmp.player self.player = tmp.player
end, end,
get_staticdata = function(self) get_staticdata = function(self)
--forceload(vector.round(self.object:getpos())) --forceload(vector.round(self.object:get_pos()))
return minetest.serialize({ return minetest.serialize({
player = self.player, player = self.player,
}) })
@ -129,7 +121,7 @@ minetest.register_entity("nether:pearl_entity", {
return return
end end
local pos = self.object:getpos() local pos = self.object:get_pos()
local rpos = vector.round(pos) local rpos = vector.round(pos)
local lastpos = self.lastpos local lastpos = self.lastpos
if not lastpos then if not lastpos then

View File

@ -2,8 +2,7 @@
-- kills the player if he uses PilzAdam portal -- kills the player if he uses PilzAdam portal
local portal_target = nether.buildings+1 local portal_target = nether.buildings+1
local nether_prisons = minetest.settings:get_bool("enable_damage") local damage_enabled = minetest.settings:get_bool"enable_damage"
local obsidian_portal_kills = nether_prisons and true
local mclike_portal = false local mclike_portal = false
local abm_allowed local abm_allowed
@ -13,20 +12,20 @@ end)
local save_path = minetest.get_worldpath() .. "/nether_players" local save_path = minetest.get_worldpath() .. "/nether_players"
local players_in_nether = {} local players_in_nether = {}
-- only get info from file if nether prisons
if nether_prisons then -- Load the list of players which are trapped in the nether
-- (or would be trapped if nether.trap_players was true)
do
local file = io.open(save_path, "r") local file = io.open(save_path, "r")
if not file then if file then
return local contents = file:read"*all"
end io.close(file)
local contents = file:read"*all" if contents then
io.close(file) local playernames = string.split(contents, " ")
if not contents then for i = 1,#playernames do
return players_in_nether[playernames[i]] = true
end end
local playernames = string.split(contents, " ") end
for i = 1,#playernames do
players_in_nether[playernames[i]] = true
end end
end end
@ -43,7 +42,7 @@ local function save_nether_players()
end end
local update_background local update_background
if nether_prisons then if nether.trap_players then
function update_background(player, down) function update_background(player, down)
if down then if down then
player:set_sky({r=15, g=0, b=0}, "plain") player:set_sky({r=15, g=0, b=0}, "plain")
@ -72,7 +71,7 @@ end
-- where the player appears after dying -- where the player appears after dying
local function get_player_died_target(player) local function get_player_died_target(player)
local target = vector.add(player:getpos(), local target = vector.add(player:get_pos(),
{x=math.random(-100,100), y=0, z=math.random(-100,100)}) {x=math.random(-100,100), y=0, z=math.random(-100,100)})
target.y = portal_target + math.random(4) target.y = portal_target + math.random(4)
return target return target
@ -95,9 +94,6 @@ end
-- teleports players to nether or helps it -- teleports players to nether or helps it
local function player_to_nether(player, pos) local function player_to_nether(player, pos)
local pname = player:get_player_name() local pname = player:get_player_name()
if players_in_nether[pname] then
return
end
players_in_nether[pname] = true players_in_nether[pname] = true
save_nether_players() save_nether_players()
update_background(player, true) update_background(player, true)
@ -107,8 +103,10 @@ local function player_to_nether(player, pos)
end end
minetest.chat_send_player(pname, "For any reason you arrived here. " .. minetest.chat_send_player(pname, "For any reason you arrived here. " ..
"Type /nether_help to find out things like craft recipes.") "Type /nether_help to find out things like craft recipes.")
player:set_hp(0) if nether.trap_players then
if nether_prisons then player:set_hp(0)
end
if not damage_enabled or not nether.trap_players then
player:set_pos(get_player_died_target(player)) player:set_pos(get_player_died_target(player))
end end
end end
@ -119,7 +117,7 @@ local function player_from_nether(player, pos)
players_in_nether[pname] = nil players_in_nether[pname] = nil
save_nether_players() save_nether_players()
end end
update_background(player) update_background(player, false)
player:set_pos(pos) player:set_pos(pos)
end end
@ -172,14 +170,15 @@ minetest.register_chatcommand("from_hell", {
return false, "Something went wrong." return false, "Something went wrong."
end end
minetest.chat_send_player(pname, "You are free now") minetest.chat_send_player(pname, "You are free now")
local pos = player:getpos() local pos = player:get_pos()
player_from_nether(player, {x=pos.x, y=100, z=pos.z}) player_from_nether(player, {x=pos.x, y=100, z=pos.z})
return true, pname.." is now out of the nether." return true, pname.." is now out of the nether."
end end
}) })
if nether_prisons then -- Disallow teleportation and change spawn positions if the nether traps players
if nether.trap_players then
-- randomly set player position when he/she dies in nether -- randomly set player position when he/she dies in nether
minetest.register_on_respawnplayer(function(player) minetest.register_on_respawnplayer(function(player)
local pname = player:get_player_name() local pname = player:get_player_name()
@ -192,7 +191,7 @@ if nether_prisons then
-- fixes respawn bug -- fixes respawn bug
local player = minetest.get_player_by_name(pname) local player = minetest.get_player_by_name(pname)
if player then if player then
player:moveto(target) player:move_to(target)
end end
end, pname, target) end, pname, target)
return true return true
@ -229,7 +228,7 @@ if nether_prisons then
else else
minetest.log("action", "Player \"" .. pname .. minetest.log("action", "Player \"" .. pname ..
"\" must not be in the nether, teleporting it!") "\" must not be in the nether, teleporting it!")
update_background(player) update_background(player, false)
current_pos.y = 20 current_pos.y = 20
player:set_pos(current_pos) player:set_pos(current_pos)
end end
@ -246,7 +245,7 @@ if nether_prisons then
local metatable_overridden local metatable_overridden
minetest.register_on_joinplayer(function(player) minetest.register_on_joinplayer(function(player)
-- set the background when the player joins -- set the background when the player joins
if player:getpos().y < nether.start then if player:get_pos().y < nether.start then
update_background(player, true) update_background(player, true)
end end
@ -266,12 +265,6 @@ if nether_prisons then
end end
end end
end) end)
else
-- test if player is in nether when he/she joins
minetest.register_on_joinplayer(function(player)
players_in_nether[player:get_player_name()] =
player:getpos().y < nether.start or nil
end)
end end
-- removes the violet stuff from the obsidian portal -- removes the violet stuff from the obsidian portal
@ -310,14 +303,14 @@ local function obsi_teleport_player(player, pos, target)
return return
end end
local objpos = player:getpos() local objpos = player:get_pos()
objpos.y = objpos.y+0.1 -- Fix some glitches at -8000 objpos.y = objpos.y+0.1 -- Fix some glitches at -8000
if minetest.get_node(vector.round(objpos)).name ~= "nether:portal" then if minetest.get_node(vector.round(objpos)).name ~= "nether:portal" then
return return
end end
local has_teleported local has_teleported
if obsidian_portal_kills then if damage_enabled then
obsidian_teleport(player, pname) obsidian_teleport(player, pname)
has_teleported = true has_teleported = true
elseif not mclike_portal then elseif not mclike_portal then
@ -484,7 +477,7 @@ local function make_portal(pos)
for d=0,3 do for d=0,3 do
for y=p1.y,p2.y do for y=p1.y,p2.y do
local p = {} local p
if param2 == 0 then if param2 == 0 then
p = {x=p1.x+d, y=y, z=p1.z} p = {x=p1.x+d, y=y, z=p1.z}
else else
@ -565,10 +558,11 @@ minetest.after(0.1, function()
and minetest.get_node(pt.under).name == "default:obsidian" then and minetest.get_node(pt.under).name == "default:obsidian" then
local done = make_portal(pt.under) local done = make_portal(pt.under)
if done then if done then
minetest.chat_send_player(player:get_player_name(), local pname = player:get_player_name()
minetest.chat_send_player(pname,
"Warning: If you are in the nether you may not be " .. "Warning: If you are in the nether you may not be " ..
"able to find the way out!") "able to find the way out!")
if not minetest.settings:get_bool("creative_mode") then if not minetest.is_creative_enabled(pname) then
stack:take_item() stack:take_item()
end end
end end
@ -580,8 +574,7 @@ end)
-- a not filled square -- a not filled square
vector.square = vector.square or local function vector_square(r)
function(r)
local tab, n = {}, 1 local tab, n = {}, 1
for i = -r+1, r do for i = -r+1, r do
for j = -1, 1, 2 do for j = -1, 1, 2 do
@ -601,13 +594,13 @@ local function is_netherportal(pos)
return return
end end
end end
for _,sn in pairs(vector.square(1)) do for _,sn in pairs(vector_square(1)) do
if minetest.get_node({x=x+sn[1], y=y-1, z=z+sn[2]}).name ~= "nether:netherrack" if minetest.get_node({x=x+sn[1], y=y-1, z=z+sn[2]}).name ~= "nether:netherrack"
or minetest.get_node({x=x+sn[1], y=y+3, z=z+sn[2]}).name ~= "nether:blood_cooked" then or minetest.get_node({x=x+sn[1], y=y+3, z=z+sn[2]}).name ~= "nether:blood_cooked" then
return return
end end
end end
for _,sn in pairs(vector.square(2)) do for _,sn in pairs(vector_square(2)) do
if minetest.get_node({x=x+sn[1], y=y-1, z=z+sn[2]}).name ~= "nether:netherrack_black" if minetest.get_node({x=x+sn[1], y=y-1, z=z+sn[2]}).name ~= "nether:netherrack_black"
or minetest.get_node({x=x+sn[1], y=y+3, z=z+sn[2]}).name ~= "nether:wood_empty" then or minetest.get_node({x=x+sn[1], y=y+3, z=z+sn[2]}).name ~= "nether:wood_empty" then
return return
@ -650,14 +643,19 @@ local function set_portal(t, z,x, y)
t[z][x] = y t[z][x] = y
end end
local function get_player_nodepos(player)
local pos = player:get_pos()
pos.y = pos.y + player:get_properties().collisionbox[2] + 0.5
return vector.round(pos)
end
-- used when a player eats that fruit in a portal -- used when a player eats that fruit in a portal
function nether_port(player, pos) function nether.teleport_player(player)
if not player if not player then
or not pos minetest.log("error", "[nether] Missing player.")
or not pos.x then
minetest.log("error", "[nether] nether_port: something failed.")
return return
end end
local pos = get_player_nodepos(player)
if not is_netherportal(pos) then if not is_netherportal(pos) then
return return
end end

24
nether/settings.lua Normal file
View File

@ -0,0 +1,24 @@
local default_settings = {
trap_players = true,
log_to_chat = false,
log_level = 2,
overworld_help = true,
}
nether.settings = {}
for name,dv in pairs(default_settings) do
local setting
local setting_name = "nether." .. name
if type(dv) == "boolean" then
setting = minetest.settings:get_bool(setting_name)
elseif type(dv) == "number" then
setting = tonumber(minetest.settings:get(setting_name))
else
error"[nether] Only boolean and number settings are available"
end
if setting == nil then
setting = dv
end
nether[name] = setting
end

23
nether/settingtypes.txt Normal file
View File

@ -0,0 +1,23 @@
# If enabled, regular players which are in the nether can leave it only with
# a nether portal and other ways of teleportation, e.g. the /spawn
# chatcommand, are blocked. Similarly, the nether can only be entered with a
# portal.
# This forces the players to investigate the nether and build a portal with
# hellish effort to go back to their home in the overworld.
# It is recommended to disable this setting in creative mode or if damage is
# disabled.
nether.trap_players (Trap players) bool true
# If enabled, show log messages in the chat and not only in debug.txt
nether.log_to_chat (Log messages to chat) bool false
# Specify how much text is printed for debugging purposes
# 0: Disabled
# 1: A bit of information
# 2: Acceptable amount of information
# 3: Lots of text
nether.log_level (Log level) int 2 0 3
# If disabled, players cannot view the nether guide with /nether_help
# in the overworld.
nether.overworld_help (Overworld help) bool true

View File

@ -5,7 +5,7 @@ end
local r_chs = {} local r_chs = {}
function nether_weird_noise(minp, fct, s, seed, range, scale) local function nether_weird_noise(minp, fct, s, seed, range, scale)
if not r_chs[s] then if not r_chs[s] then
r_chs[s] = math.floor(s/3+0.5) r_chs[s] = math.floor(s/3+0.5)
end end
@ -86,3 +86,5 @@ minetest.register_node("ac:wmg", {
end end
end, end,
})]] })]]
return nether_weird_noise