1
0
mirror of https://github.com/HybridDog/nether-pack.git synced 2025-07-03 00:20:45 +02:00

1 Commits

Author SHA1 Message Date
71236002de Version MFF. 2018-09-08 14:10:05 +02:00
134 changed files with 907 additions and 842 deletions

0
.gitignore vendored Normal file → Executable file
View File

View File

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

View File

@ -1,11 +1,22 @@
For a description of this Minetest mod, please refer to the forum topic:
https://forum.minetest.net/viewtopic.php?f=9&t=10265
[Mod] nether-pack [nether-pack]
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…
**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)
this happens really selden to me
![I'm a screenshot!](http://i.imgur.com/pMZYqt9.png)
If you got ideas or found bugs, please tell them to me.
[How to install a mod?](http://wiki.minetest.net/Installing_Mods)
TODO:
* Mapgen: Find a way to get the perlin noise values inside [-1; 1] or use
another noise.
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
TODO:
— find a way to get the perlin noise inside [-1; 1] or use another noise
add something containing items to that buildings

1
modpack.txt Normal file → Executable file
View File

@ -1 +0,0 @@
0

View File

@ -1,17 +0,0 @@
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"}}

2
nether/crafting.lua Normal file → Executable file
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
return
end
minetest.sound_play("default_wood_footstep", {pos=player:get_pos(), gain=0.25})
minetest.sound_play("default_wood_footstep", {pos=player:getpos(), gain=0.25})
sound_allowed = false
minetest.after(0, function()
sound_allowed = true

7
nether/depends.txt Executable file
View File

@ -0,0 +1,7 @@
default
glow
riesenpilz
stairs
vector_extras
fence_registration?
watershed?

6
nether/furnace.lua Normal file → Executable file
View File

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

597
nether/guide.lua Normal file → Executable file
View File

@ -1,238 +1,362 @@
-- The content of the guide
local cube = minetest.inventorycube
-- the content of the guide
local guide_infos = {
{"Nether Mushroom",
[[Nether mushrooms can be found on the nether's ground and on Dirty Netherrack. They can be dug by hand.
<item name=riesenpilz:nether_shroom width=100>
<my_h2><b>Crafting Items</b></my_h2>
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.
<item name=nether:shroom_head width=100> <item name=nether:shroom_stem width=100>
<my_h2><b>Cultivating Mushrooms</b></my_h2>
We can get more mushrooms using Dirty Netherrack:
1. Search a dark place (light level <= 7) and, if necessary, place Netherrack with air above it
<img name=nether_netherrack.png width=100>
2. Right click with Cooked Blood onto the Netherrack to turn it into Dirty Netherrack
<item name=nether:hotbed width=100> <img name=nether_netherrack.png^nether_netherrack_soil.png width=100>
3. Right click onto the Dirty Netherrack with a Nether mushroom head to add some spores
<item name=nether:shroom_head width=100> <img name=nether_netherrack.png^nether_netherrack_soil.png width=100>
4. Wait
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).
<img name=riesenpilz_nether_shroom_side.png width=100>
<img name=nether_netherrack.png^nether_netherrack_soil.png width=100>
]]},
{"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>
We can craft four Nether Blood Wood nodes with the stem.
<item name=nether:wood width=100>
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.
<my_h2><b>Nether Fruit</b></my_h2>
<item name=nether:apple width=100>
Eating a Nether Fruit decreases life but it might work against hunger and give us blood:
<item name=nether:blood_extracted width=100>
If we eat it at the right place inside a portal, we will teleport instead of getting blood.
If we drop it without holding the fast key, we can split it into its fruit and leaf:
<item name=nether:fruit_leaf width=100> <item name=nether:fruit_no_leaf width=100>
We can craft a fruit leave block out of 9 fruit leaves
The fruit can be used to craft a nether pearl.
<item name=nether:fruit_leaves width=100>
A fruit leaves block
<my_h2><b>Cultivating Blood Structures</b></my_h2>
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.
<img name=nether_sapling.png width=100>
<img name=nether_blood.png^nether_blood_side.png width=100>
]]},
{"Tools",
[[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.
<my_h2><b>Nether Mushroom Pickaxe</b></my_h2>
<item name=nether:pick_mushroom width=100>
Strength: 1
This pickaxe needs mushroom stems and heads to be crafted.
<my_h2><b>Nether Wood Pickaxe</b></my_h2>
<item name=nether:pick_wood width=100>
Strength: 2
This pickaxe can be crafted with Cooked Nether Blood Wood.
<my_h2><b>Netherrack Tools</b></my_h2>
<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>
Strength: 3
The red Netherrack tools can be crafted with usual Netherrack.
<my_h2><b>Faster Tools</b></my_h2>
<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>
Strength: 3
The blue Netherrack tools can be crafted with Blue Netherrack.
<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>
Strength: 3
The Siwtonic tools can be crafted with the Siwtonic block.
]]},
{"Cooking",
[[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.
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>
To craft the furnace, we can use the netherrack bricks like cobble:
<item name=nether:netherrack_brick width=100> <item name=nether:netherrack_brick width=100> <item name=nether:netherrack_brick width=100>
<item name=nether:netherrack_brick width=100> <img name=nether_transparent.png width=100> <item name=nether:netherrack_brick width=100>
<item name=nether:netherrack_brick width=100> <item name=nether:netherrack_brick width=100> <item name=nether:netherrack_brick width=100>
<my_h2><b>Cooking Outputs</b></my_h2>
Some nether items can be cooked, for example the Blood Structure's nodes.
<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>
Other cookable items are Blood and an item to get a Nether Pearl.
<item name=nether:hotbed width=100> <item name=nether:pearl width=100>
]]},
{"Nether Blood Extractor",
[[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.
<my_h2><b>Craft Recipe</b></my_h2>
We can craft the Nether Blood Extractor as follows:
<item name=nether:netherrack_brick width=100> <item name=nether:blood_top_cooked width=100> <item name=nether:netherrack_brick width=100>
<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>
<item name=nether:netherrack_brick width=100> <item name=nether:blood_stem_cooked width=100> <item name=nether:netherrack_brick width=100>
<my_h2><b>Usage</b></my_h2>
We can feed the extractor with Blood to make it separate Blood from neighbouring nodes:
1. Place the Nether Blood Extractor somewhere
2. Place four or fewer Blood Structure's nodes next to it. Example viewed from the top:
<img name=nether_transparent.png width=100> <img name=nether_blood_stem_top.png width=100> <img name=nether_transparent.png width=100>
<img name=nether_blood.png width=100> <img name=nether_blood_extractor.png width=100> <img name=nether_blood.png width=100>
<img name=nether_transparent.png width=100> <img name=nether_blood.png width=100> <img name=nether_transparent.png width=100>
3. Right click the extractor with Blood to power it
<img name=nether_transparent.png width=100> <img name=nether_blood_stem_top_empty.png width=100> <img name=nether_transparent.png width=100>
<img name=nether_blood_empty.png width=100> <img name=nether_blood_extractor.png width=100> <img name=nether_blood_empty.png width=100>
<img name=nether_transparent.png width=100> <img name=nether_blood_empty.png width=100> <img name=nether_transparent.png width=100>
4. Take the new extracted blood and dig the extracted nodes
]]},
{"Ores and Bricks",
[[Digging ores requires a pickaxe from the nether of a sufficient strength. Pickaxes from the overworld do not work in general.
<my_h2><b>Strength 1</b></my_h2>
<item name=glow:stone width=100>
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.
<my_h2><b>Strength 2</b></my_h2>
<item name=nether:netherrack width=100> <item name=nether:netherrack_tiled width=100> <item name=nether:netherrack_black width=100>
The (red) Netherrack is generated like stone, Tiled Netherrack is generated like coal ore and the Black Netherrack is generated like gravel.
<my_h2><b>Strength 3</b></my_h2>
<item name=nether:netherrack_blue width=100> <item name=nether:white width=100>
The Blue Netherrack is generated like diamond ore and the Siwtonic block is generated like mese blocks.
<my_h2><b>Bricks</b></my_h2>
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.
<item name=nether:netherrack_brick width=100> <item name=nether:netherrack_brick_blue width=100> <item name=nether:netherrack_brick_black width=100>
]]},
{"Nether Vines",
[[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.
<item name=nether:vine width=100>
]]},
{"Portals",
[[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.
<my_h2><b>Build Instructions</b></my_h2>
A nether portal requires the following nodes:
<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>
* 25 (empty) Nether Wood (height 5-6)
* 16 Black Netherrack (height 1)
* 12 Blue Netherrack Bricks (height 2-4)
* 8 (red) Netherrack (height 1)
* 8 Cooked Nether Blood (height 5)
* 4 Nether Fruits (height 4)
* 2 Siwtonic blocks (height 1 and 5)
The heights in parenthesis correspond to the relative vertical positions of the nodes. When built, the portal should look approximately like this one:
<img name=nether_teleporter.png width=600>
<my_h2><b>Usage</b></my_h2>
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.
We can activate the portal as follows:
1. Stand in the middle on the Siwtonic block
2. Eat a Nether Fruit. If the portal was built correctly, we can hear a special sound and are teleported to the overworld.
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.
]]},
{"Pearls",
[[The nether pearl can be used to teleport by throwing it.
<my_h2><b>Craft Recipe</b></my_h2>
First, we need to craft two Nether Mushroom Heads and a Nether Fruit Without Leaf together as follows:
<item name=nether:shroom_head width=100>
<item name=nether:fruit_no_leaf width=100>
<item name=nether:shroom_head width=100>
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>
]]},
{"Nether Forest",
[[The nether forest is generated in caves above the nether and contains decorative plants.
<my_h2><b>Grass and Flower</b></my_h2>
<item name=nether:grass_big width=100> <item name=nether:grass_middle width=100> <item name=nether:grass_small width=100>
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.
<item name=nether:glowflower width=100>
The Glowing Flower can be used for lighting and decoration.
<my_h2><b>Nether Tree</b></my_h2>
<item name=nether:tree width=100>
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.
]]}
{
description = "Mushrooms",
{"text", "Nether mushrooms can be found on the nether's ground and\n"..
"on netherrack soil, it can be dug by hand."},
{"image", {1, 1, "riesenpilz_nether_shroom_side.png"}},
{"y", 0.2},
{"text", "If you drop it without holding the fast key, you can split it into its stem and head:"},
{"image", {1, 1, "nether_shroom_top.png", 1}},
{"image", {1, 1, "nether_shroom_stem.png"}},
{"y", 0.1},
{"text", "You can get more mushrooms by using a netherrack soil:\n"..
"1. search a dark place and, if necessary, place netherrack with air about it\n"..
"2. right click with cooked blood onto the netherrack to make it soiled\n"..
"3. right click onto the netherrack soil with a nether mushroom head to add some spores\n"..
"4. dig the mushroom which grew after some time to make place for another one"},
{"image", {1, 1, "riesenpilz_nether_shroom_side.png", 6, 0.12}},
{"y", 1},
{"image", {1, 1, "nether_netherrack.png^nether_netherrack_soil.png", 1.8}},
{"image", {1, 1, "nether_hotbed.png", 1.3, -0.4}},
{"image", {1, 1, "nether_netherrack.png^nether_netherrack_soil.png", 3.6}},
{"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"}},
},
{
description = "Tools",
{"text", "You can craft 5 kinds of tools in the nether,\n"..
"which (except the mushroom pick) require sticks to be crafted:"},
{"image", {1, 1, "nether_pick_mushroom.png"}},
{"y", 0.1},
{"text", "strength : 1\n"..
"The mushroom pick needs mushroom stems and heads to be crafted."},
{"image", {1, 1, "nether_pick_wood.png"}},
{"y", 0.1},
{"text", "strength : 2\n"..
"The nether wood pick can be crafted with cooked nether blood wood."},
{"image", {1, 1, "nether_axe_netherrack.png", 1.5}},
{"image", {1, 1, "nether_shovel_netherrack.png", 3}},
{"image", {1, 1, "nether_sword_netherrack.png", 4.5}},
{"image", {1, 1, "nether_pick_netherrack.png"}},
{"y", 0.1},
{"text", "strength : 3\n"..
"The red netherrack tools can be crafted with usual netherrack."},
{"image", {1, 1, "nether_axe_netherrack_blue.png", 1.5}},
{"image", {1, 1, "nether_shovel_netherrack_blue.png", 3}},
{"image", {1, 1, "nether_sword_netherrack_blue.png", 4.5}},
{"image", {1, 1, "nether_pick_netherrack_blue.png"}},
{"y", 0.1},
{"text", "strength : 3\n"..
"The blue netherrack tools can be crafted with blue netherrack."},
{"image", {1, 1, "nether_axe_white.png", 1.5}},
{"image", {1, 1, "nether_shovel_white.png", 3}},
{"image", {1, 1, "nether_sword_white.png", 4.5}},
{"image", {1, 1, "nether_pick_white.png"}},
{"y", 0.1},
{"text", "strength : 3\n"..
"The siwtonic tools can be crafted with the siwtonic ore."},
},
{
description = "Blood structures",
{"text", "You can find blood structures on the ground and\n"..
"dig their nodes even with the bare hand."},
{"y", 0.5},
{"text", "One contains 4 kinds of blocks :"},
{"image", {1, 1, cube("nether_blood.png"), 1}},
{"image", {1, 1,
cube("nether_blood_top.png", "nether_blood.png^nether_blood_side.png", "nether_blood.png^nether_blood_side.png"),
2}},
{"image", {1, 1, "nether_fruit.png", 3}},
{"image", {1, 1, cube("nether_blood_stem_top.png", "nether_blood_stem.png", "nether_blood_stem.png")}},
{"y", 0.1},
{"text", "Blood stem, blood, blood head and nether fruit"},
{"y", 0.1},
{"text", "You can craft 4 blood wood with the stem :"},
{"image", {1, 1, cube("nether_wood.png")}},
{"y", 0.1},
{"text", "The 4 blood nodes can be cooked and, except\n"..
"blood wood, their blood can be extracted."},
},
{
description = "Fruits",
{"text", "You can find the nether fruits on blood structures\n"..
"and dig them even with the bare hand."},
{"image", {1, 1, "nether_fruit.png"}},
{"text", "Eating it will make you lose life but\n"..
"it might feed you and give you blood :"},
{"image", {1, 1, "nether_blood_extracted.png"}},
{"y", 0.2},
{"text", "If you eat it at the right place inside a portal,\n"..
"you will teleport instead of getting blood."},
{"y", 0.2},
{"text", "If you drop it without holding the fast key,\n"..
"you can split it into its fruit and leaf:"},
{"image", {1, 1, "nether_fruit_leaf.png", 1}},
{"image", {1, 1, "nether_fruit_no_leaf.png"}},
{"y", 0.2},
{"text", "Craft a fruit leave block out of 9 fruit leaves\n"..
"The fruit can be used to craft a nether pearl."},
{"image", {1, 1, cube("nether_fruit_leaves.png")}},
{"y", 0.2},
{"text", "A fruit leaves block"},
},
{
description = "Cooking",
{"text", "To get a furnace you need to dig at least 8 netherrack bricks.\n"..
"They can be found at pyramid like constructions and require at least\n"..
"a strength 1 nether pick to be dug.\n"..
"To craft the furnace, use the netherrack bricks like cobble:"},
{"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")}},
{"image", {0.5, 0.5, cube("nether_netherrack_brick.png"), 1}},
{"image", {0.5, 0.5, cube("nether_netherrack_brick.png")}},
{"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")}},
{"y", 0.2},
{"text", "To begin cooking stuff, you can use a mushroom or fruit.\n"..
"After that it's recommended to use cooked blood nodes."},
{"y", 0.1},
{"text", "Some nether items can be cooked:"},
{"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}},
{"image", {1, 1,
cube("nether_blood_top_cooked.png", "nether_blood_cooked.png^nether_blood_side_cooked.png", "nether_blood_cooked.png^nether_blood_side_cooked.png"),
2.9}},
{"image", {1, 1, cube("nether_wood_cooked.png"), 4.3}},
{"y", 1.2},
{"text", "Some cooked blood stem, cooked blood,\n"..
"cooked blood head and cooked blood wood,"},
{"image", {1, 1, "nether_hotbed.png", 0.3}},
{"image", {1, 1, "nether_pearl.png", 2}},
{"y", 1.2},
{"text", "Some cooked extracted blood and a nether pearl"},
},
{
description = "Extractors",
{"text", "Here you can find out information about the nether extractor."},
{"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}},
{"image", {0.5, 0.5, cube("nether_netherrack_brick.png"), 1}},
{"image", {0.5, 0.5, cube("nether_netherrack_brick.png")}},
{"image", {0.5, 0.5, cube("nether_blood_extractor.png"), 2.5}},
{"image", {0.5, 0.5, "nether_shroom_stem.png", 0.5}},
{"image", {0.5, 0.5, cube("nether_blood_cooked.png"), 1}},
{"image", {0.5, 0.5, cube("nether_blood_cooked.png")}},
{"image", {0.5, 0.5, cube("nether_blood_stem_top_cooked.png", "nether_blood_stem_cooked.png", "nether_blood_stem_cooked.png"), 0.5}},
{"image", {0.5, 0.5, cube("nether_netherrack_brick.png"), 1}},
{"image", {0.5, 0.5, cube("nether_netherrack_brick.png")}},
{"y", 0.2},
{"text", "Extract blood from the blood nodes you get from the blood structures.\n"..
"You can also get blood with a nether fruit."},
{"y", 0.2},
{"text", "So you can use it:\n"..
"1. place it somewhere\n"..
"2. place blood blocks next to it (4 or less)\n"..
"3. right click with extracted blood onto it to power it\n"..
"4. take the new extracted blood and dig the extracted nodes"},
{"y", 0.2},
{"text", "Example (view from the top):"},
{"y", 0.88},
{"image", {1, 1, "nether_blood_stem_top.png", 0.82, -0.88}},
{"image", {1, 1, "nether_blood.png", 1.63}},
{"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}},
{"image", {1, 1, "nether_blood_empty.png", 3.001}},
{"image", {1, 1, "nether_blood_extractor.png", 3.82}},
{"image", {1, 1, "nether_blood.png"}},
{"image", {1, 1, "nether_blood.png", 0.82, -0.12}},
{"image", {1, 1, "nether_blood_empty.png", 3.82, -0.12}},
{"y", 1.2},
{"text", "The empty blood stem can be crafted into empty nether wood,\n"..
"which can be crafted into nether sticks."},
},
{
description = "Ores",
{"text", "You can find 5 types of ores:"},
{"image", {1, 1, cube("nether_netherrack_black.png"), 4}},
{"image", {1, 1, cube("nether_netherrack.png")}},
{"y", 0.2},
{"text", "The red netherrack is generated like stone.\n"..
"The black netherrack is generated like gravel.\n"..
"Both require at least a strength 2 nether pick to be dug."},
{"image", {1, 1, cube("nether_white.png"), 4}},
{"image", {1, 1, cube("nether_netherrack_blue.png")}},
{"y", 0.2},
{"text", "The blue netherrack is generated like diamond ore.\n"..
"The siwtonic ore is generated like mese blocks.\n"..
"Both require at least a strength 3 nether pick to be dug."},
{"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", "21 empty nether wooden planks\n"..
"12 blue netherrack bricks\n"..
"12 black netherrack\n"..
"8 red netherrack\n"..
"8 cooked nether wood\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 guide formspecs
local guide_forms = {}
-- the size of guide pages
local guide_size = {x=40, y=10, cx=0.2, cy=0.2}
-- Convert the guide content to formspecs
-- informations about settings and ...
local formspec_offset = {x=0.25, y=0.50}
local font_size
if minetest.is_singleplayer() then
font_size = tonumber(minetest.setting_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
local title, html_content = data[1], data[2]
--~ local html_text = "<global background=#242424 size=24><tag name=my_h1 size=35>" ..
local html_text = "<global size=24><tag name=my_h1 size=35>" ..
"<tag name=my_h2 size=30>" ..
"<my_h1><b><center>" .. title .. "</b></center></my_h1>\n" ..
html_content
local spec_width = 16
local spec_height = 16
local html_padding = 0.5
local form = ("formspec_version[4]size[%g,%g;]" ..
"hypertext[%g,%g;%g,%g;html;%s]button[%g,%g;2,0.8;quit;Back]"
):format(
spec_width, spec_height,
html_padding, html_padding,
spec_width - 2 * html_padding, spec_height - 1 - 2 * html_padding,
minetest.formspec_escape(html_text),
0.5 * spec_width - 1, spec_height - 1)
guide_forms[n] = {title, form}
local form = ""
local y = 0
local x = guide_size.cx
for _,i in ipairs(data) do
local typ, content = unpack(i)
if typ == "y" then
y = y+content
elseif typ == "x" then
x = math.max(x, content)
elseif typ == "text" then
--local tab = minetest.splittext(content, guide_size.fx)
local l = guide_size.cx
--[[for _,str in ipairs(tab) do
form = form.."label["..guide_size.cx ..","..guide_size.cy+y..";"..str.."]"
y = y+guide_size.fy
l = math.max(l, #str)
end]]
x = math.max(x, l/font_size)
elseif typ == "image" then
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
local title_to_index = {}
for n, i in ipairs(guide_forms) do
title_to_index[i[1]] = n
local desc_tab = {}
for n,i in ipairs(guide_forms) do
desc_tab[i[1]] = n
end
-- Create the contents formspec
guide_forms.contents = "formspec_version[4]size[6," .. (#guide_infos) + 2 ..
";]label[2,0.8;Contents:]"
for i, data in ipairs(guide_forms) do
local desc = data[1]
local y = i + 0.5 + 0.1
guide_forms.contents = guide_forms.contents ..
"button[0.5," .. y .. ";5,0.8;name;" .. desc .. "]"
-- creates contents formspec
local y = 0
for y,i in ipairs(guide_forms) do
local desc, form = unpack(i)
local s = #desc*1.3/font_size+1.5
guide_forms.contents = guide_forms.contents.."button["..guide_size.cx*12/s-0.5 ..","..guide_size.cy+y/1.3 ..";"..s..",1;name;"..desc.."]"
end
-- shows the contents of the formspec
local function show_guide(pname)
minetest.show_formspec(pname, "nether_guide_contents", guide_forms["contents"])
end
minetest.register_on_player_receive_fields(function(player, formname, fields)
@ -241,16 +365,14 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
local pname = player:get_player_name()
if fname
and pname then
minetest.show_formspec(pname, "nether_guide",
guide_forms[title_to_index[fname]][2])
minetest.show_formspec(pname, "nether_guide", guide_forms[desc_tab[fname]][2])
end
elseif formname == "nether_guide" then
local fname = fields.quit
local pname = player:get_player_name()
if fname
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)
@ -261,16 +383,15 @@ minetest.register_chatcommand("nether_help", {
func = function(name)
local player = minetest.get_player_by_name(name)
if not player then
return false, "Something went wrong."
end
if not nether.overworld_help and player:get_pos().y > nether.start then
return false, "Usually you don't neet this guide here. " ..
"You can view it in the nether."
minetest.chat_send_player(name, "Something went wrong.")
return false
end
--[[ if player:getpos().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
end --]]
minetest.chat_send_player(name, "Showing guide...")
-- Show the Contents (overview) page
minetest.show_formspec(name, "nether_guide_contents",
guide_forms["contents"])
show_guide(name)
return true
end
})

401
nether/init.lua Normal file → Executable file
View File

@ -11,7 +11,7 @@
-- godkiller447 (ideas)
-- If I didn't list you, please let me know!
local load_time_start = minetest.get_us_time()
local load_time_start = os.clock()
if not rawget(_G, "nether") then
nether = {}
@ -19,6 +19,15 @@ end
--== 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
local nether_middle = -20000
@ -43,6 +52,9 @@ local grass_rarity = 2
-- Frequency of nether mushrooms in the nether forest (higher is less frequent)
local mushroom_rarity = 80
-- Frequency of trees in the nether forest (higher is less frequent)
local tree_rarity = 200
local abm_tree_interval = 864
local abm_tree_chance = 100
@ -53,7 +65,7 @@ nether.start = f_h_max+100
local NETHER_HEIGHT = 30
-- Maximum amount of randomness in the map generation
local NETHER_RANDOM = 2
NETHER_RANDOM = 2
-- Frequency of Glowstone on the "roof" of the Nether (higher is less frequent)
local GLOWSTONE_FREQ_ROOF = 500
@ -74,60 +86,63 @@ local NETHER_SHROOM_FREQ = 100
--NETHER_APPLE_FREQ = 5
-- Frequency of healing apples in a nether structure (higher is less frequent)
--NETHER_HEAL_APPLE_FREQ = 10
-- Start position for the Throne of Hades (y is relative to the bottom of the
-- nether)
-- Start position for the Throne of Hades (y is relative to the bottom of the nether)
--HADES_THRONE_STARTPOS = {x=0, y=1, z=0}
-- Spawn pos for when the nether hasn't been loaded yet (i.e. no portal in the
-- nether) (y is relative to the bottom of the nether)
-- Spawn pos for when the nether hasn't been loaded yet (i.e. no portal in the nether) (y is relative to the bottom of the nether)
--NETHER_SPAWNPOS = {x=0, y=5, z=0}
-- Structure of the nether portal (all is relative to the nether portal creator
-- block)
-- Structure of the nether portal (all is relative to the nether portal creator block)
--== END OF EDITABLE OPTIONS ==--
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
if nether.info then
function nether:inform(msg, spam, t)
if spam <= self.log_level then
if spam <= self.max_spam then
local info
if t then
info = "[nether] " .. msg .. (" after ca. %.3g s"):format(
(minetest.get_us_time() - t) / 1000000)
info = string.format("[nether] "..msg.." after ca. %.2fs", os.clock() - t)
else
info = "[nether] " .. msg
info = "[nether] "..msg
end
print(info)
if self.log_to_chat then
minetest.log("action", info)
if self.inform_all then
minetest.chat_send_all(info)
end
end
end
else
function nether.inform()
function nether:inform()
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")
local function table_contains(t, v)
for _,i in pairs(t) do
if i == v then
return true
end
end
return false
end
-- Weierstrass function stuff from https://github.com/slemonide/gen
local SIZE = 1000
local ssize = math.ceil(math.abs(SIZE))
local function do_ws_func(depth, a, x)
local n = math.pi * x / (16 * SIZE)
local n = x/(16*SIZE)
local y = 0
for k=1,depth do
y = y + math.sin(k^a * n) / k^a
y = y + math.sin(math.pi * k^a * n)/(k^a)
end
return SIZE * y / math.pi
return SIZE*y/math.pi
end
local chunksize = minetest.settings:get"chunksize" or 5
local chunksize = minetest.setting_get("chunksize") or 5
local ws_lists = {}
local function get_ws_list(a,x)
ws_lists[a] = ws_lists[a] or {}
@ -146,6 +161,10 @@ end
local function dif(z1, z2)
if z1 < 0
and z2 < 0 then
z1,z2 = -z1,-z2
end
return math.abs(z1-z2)
end
@ -163,25 +182,43 @@ end
local function set_vm_data(manip, nodes, pos, t1, name, generated)
manip:set_data(nodes)
manip:write_to_map(not generated)
nether:inform(name.." grew at " .. minetest.pos_to_string(pos),
generated and 3 or 2, t1)
manip:write_to_map()
local spam = 2
if generated then
spam = 3
end
nether:inform(name.." grew at ("..pos.x.."|"..pos.y.."|"..pos.z..")", spam, t1)
if not generated then
local t1 = os.clock()
manip:update_map()
nether:inform("map updated", spam, t1)
end
end
local function fix_light(minp, maxp)
local manip = minetest.get_voxel_manip()
local emerged_pos1, emerged_pos2 = manip:read_from_map(minp, maxp)
local area = VoxelArea:new({MinEdge=emerged_pos1, MaxEdge=emerged_pos2})
local nodes = manip:get_data()
-- MODIFICATION MADE FOR MFF ^
manip:set_data(nodes)
manip:write_to_map()
manip:update_map()
end
-- Generated variables
local NETHER_BOTTOM = (nether_middle - NETHER_HEIGHT)
nether.buildings = NETHER_BOTTOM+12
--~ local NETHER_ROOF_ABS = (nether_middle - NETHER_RANDOM)
local NETHER_ROOF_ABS = (nether_middle - NETHER_RANDOM)
local f_yscale_top = (f_h_max-f_h_min)/2
local f_yscale_bottom = f_yscale_top/2
--HADES_THRONE_STARTPOS_ABS = {x=HADES_THRONE_STARTPOS.x, y=(NETHER_BOTTOM +
--HADES_THRONE_STARTPOS.y), z=HADES_THRONE_STARTPOS.z}
--HADES_THRONE_STARTPOS_ABS = {x=HADES_THRONE_STARTPOS.x, y=(NETHER_BOTTOM + HADES_THRONE_STARTPOS.y), z=HADES_THRONE_STARTPOS.z}
--LAVA_Y = (NETHER_BOTTOM + LAVA_HEIGHT)
--HADES_THRONE_ABS = {}
--HADES_THRONE_ENDPOS_ABS = {}
--HADES_THRONE_GENERATED = minetest.get_worldpath() .. "/netherhadesthrone.txt"
--NETHER_SPAWNPOS_ABS = {x=NETHER_SPAWNPOS.x, y=(NETHER_BOTTOM +
--NETHER_SPAWNPOS.y), z=NETHER_SPAWNPOS.z}
--NETHER_SPAWNPOS_ABS = {x=NETHER_SPAWNPOS.x, y=(NETHER_BOTTOM + NETHER_SPAWNPOS.y), z=NETHER_SPAWNPOS.z}
--[[for i,v in ipairs(HADES_THRONE) do
v.pos.x = v.pos.x + HADES_THRONE_STARTPOS_ABS.x
v.pos.y = v.pos.y + HADES_THRONE_STARTPOS_ABS.y
@ -204,7 +241,7 @@ for i,v in ipairs(HADES_THRONE_ABS) do
end
HADES_THRONE_ENDPOS_ABS = {x=htx, y=hty, z=htz}]]
local c, nether_tree_nodes
local c
local function define_contents()
c = {
ignore = minetest.get_content_id("ignore"),
@ -215,8 +252,7 @@ local function define_contents()
diamond = minetest.get_content_id("default:stone_with_diamond"),
mese = minetest.get_content_id("default:mese"),
--https://github.com/Zeg9/minetest-glow
glowstone = minetest.get_content_id("glow:stone"),
glowstone = minetest.get_content_id("glow:stone"), --https://github.com/Zeg9/minetest-glow
nether_shroom = minetest.get_content_id("riesenpilz:nether_shroom"),
@ -246,12 +282,6 @@ local function define_contents()
nether_dirt_top = minetest.get_content_id("nether:dirt_top"),
nether_dirt_bottom = minetest.get_content_id("nether:dirt_bottom"),
}
local trn = {c.nether_tree, c.nether_tree_corner, c.nether_leaves,
c.nether_fruit}
nether_tree_nodes = {}
for i = 1,#trn do
nether_tree_nodes[trn[i]] = true
end
end
local pr, contents_defined
@ -278,14 +308,13 @@ end
local f_perlins = {}
-- abs(v) < 1-(persistance^octaves))/(1-persistance) = amp
--local perlin1 = minetest.get_perlin(13,3, 0.5, 50) --Get map specific perlin
--local perlin1 = minetest.get_perlin(13,3, 0.5, 50) --Get map specific perlin
-- local perlin2 = minetest.get_perlin(133,3, 0.5, 10)
-- local perlin3 = minetest.get_perlin(112,3, 0.5, 5)
local tmp = f_yscale_top*4
local tmp2 = tmp/f_bottom_scale
local perlins = {
{ -- amp 1.75
{
seed = 13,
octaves = 3,
persist = 0.5,
@ -293,7 +322,7 @@ local perlins = {
scale = 1,
offset = 0,
},
{-- amp 1.75
{
seed = 133,
octaves = 3,
persist = 0.5,
@ -301,7 +330,7 @@ local perlins = {
scale = 1,
offset = 0,
},
{-- amp 1.75
{
seed = 112,
octaves = 3,
persist = 0.5,
@ -317,7 +346,7 @@ local perlins = {
scale = 1,
offset = 0,
},]]
forest_top = {-- amp 2.44
forest_top = {
seed = 21,
octaves = 3,
persist = 0.8,
@ -327,26 +356,18 @@ local perlins = {
},
}
-- buffers, see https://forum.minetest.net/viewtopic.php?f=18&t=16043
local pelin_maps
local pmap1 = {}
local pmap2 = {}
local pmap3 = {}
local pmap_f_top = {}
local data = {}
local info = true
local structures_enabled = true
local vine_maxlength = math.floor(NETHER_HEIGHT/4+0.5)
-- Create the Nether
minetest.register_on_generated(function(minp, maxp, seed)
--avoid big map generation
if not (maxp.y >= NETHER_BOTTOM-100 and minp.y <= nether.start) then
if not (maxp.y >= NETHER_BOTTOM-100 and minp.y <= nether.start) then --avoid big map generation
return
end
local addpos = {}
local t1 = minetest.get_us_time()
nether:inform("generates at: x=["..minp.x.."; "..maxp.x.."]; y=[" ..
minp.y.."; "..maxp.y.."]; z=["..minp.z.."; "..maxp.z.."]", 2)
local t1 = os.clock()
nether:inform("generates at: x=["..minp.x.."; "..maxp.x.."]; y=["..minp.y.."; "..maxp.y.."]; z=["..minp.z.."; "..maxp.z.."]", 2)
if not contents_defined then
define_contents()
@ -361,50 +382,39 @@ minetest.register_on_generated(function(minp, maxp, seed)
end
local vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
vm:get_data(data)
local data = vm:get_data()
local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax}
pr = PseudoRandom(seed+33)
local tab,num = {},1
local trees,num_trees = {},1
--local perlin1 = minetest.get_perlin(13,3, 0.5, 50)
--local perlin1 = minetest.get_perlin(13,3, 0.5, 50) --Get map specific perlin
--local perlin2 = minetest.get_perlin(133,3, 0.5, 10)
--local perlin3 = minetest.get_perlin(112,3, 0.5, 5)
local side_length = maxp.x - minp.x + 1
local side_length = maxp.x - minp.x + 1 -- maybe mistake here
local map_lengths_xyz = {x=side_length, y=side_length, z=side_length}
if not pelin_maps then
pelin_maps = {
a = minetest.get_perlin_map(perlins[1], map_lengths_xyz),
b = minetest.get_perlin_map(perlins[2], map_lengths_xyz),
c = minetest.get_perlin_map(perlins[3], map_lengths_xyz),
forest_top = minetest.get_perlin_map(perlins.forest_top,
map_lengths_xyz),
}
end
pelin_maps.a:get_2d_map_flat({x=minp.x, y=minp.z}, pmap1)
pelin_maps.b:get_2d_map_flat({x=minp.x, y=minp.z}, pmap2)
pelin_maps.c:get_2d_map_flat({x=minp.x, y=minp.z}, pmap3)
local pmap1 = minetest.get_perlin_map(perlins[1], map_lengths_xyz):get2dMap_flat({x=minp.x, y=minp.z})
local pmap2 = minetest.get_perlin_map(perlins[2], map_lengths_xyz):get2dMap_flat({x=minp.x, y=minp.z})
local pmap3 = minetest.get_perlin_map(perlins[3], map_lengths_xyz):get2dMap_flat({x=minp.x, y=minp.z})
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,
-- map_lengths_xyz):get_2d_map_flat({x=minp.x, y=minp.z})
local perlin_f_bottom, strassx, strassz
--local pmap_f_bottom = minetest.get_perlin_map(perlins.forest_bottom, map_lengths_xyz):get2dMap_flat({x=minp.x, y=minp.z})
local perlin_f_bottom, pmap_f_top, strassx, strassz
if forest_possible then
perlin_f_bottom = minetest.get_perlin(11, 3, 0.8, tmp2)
pelin_maps.forest_top:get_2d_map_flat({x=minp.x, y=minp.z}, pmap_f_top)
strassx = get_ws_list(2, minp.x)
strassz = get_ws_list(2, minp.z)
pmap_f_top = minetest.get_perlin_map(perlins.forest_top, map_lengths_xyz):get2dMap_flat({x=minp.x, y=minp.z})
strassx = get_ws_list(2, minp.x, side_length)
strassz = get_ws_list(2, minp.z, side_length)
end
local num2, tab2
if buildings >= 1 then
num2 = 1
tab2 = nether_weird_noise({x=minp.x, y=nether.buildings-79, z=minp.z},
pymg, 200, 8, 10, side_length-1)
tab2 = nether_weird_noise({x=minp.x, y=nether.buildings-(maxp.y-minp.y), z=minp.z}, pymg, 200, 8, 10, maxp.y-minp.y)
end
local count = 0
@ -450,18 +460,17 @@ minetest.register_on_generated(function(minp, maxp, seed)
py_h_g = nether.buildings-7
end
local vi = area:index(x, minp.y, z)
if buildings == 1
and noisp then
if noisp == 1 then
for _ = 1,side_length do
data[vi] = c.netherrack_brick
vi = vi + area.ystride
for y=minp.y, maxp.y do
local p_addpos = area:index(x, y, z)
data[p_addpos] = c.netherrack_brick
end
else
for _ = 1,side_length do
data[vi] = c.lava
vi = vi + area.ystride
for y=minp.y, maxp.y do
local p_addpos = area:index(x, y, z)
data[p_addpos] = c.lava
end
end
else
@ -473,19 +482,15 @@ minetest.register_on_generated(function(minp, maxp, seed)
local f_bottom, f_top, is_forest, f_h_dirt
if forest_possible then
local p = {x=math.floor(x/f_bottom_scale),
z=math.floor(z/f_bottom_scale)}
local p = {x=math.floor(x/f_bottom_scale), z=math.floor(z/f_bottom_scale)}
local pstr = p.x.." "..p.z
if not f_perlins[pstr] then
f_perlins[pstr] = math.floor(f_h_min + (math.abs(
perlin_f_bottom:get_2d{x=p.x, y=p.z} + 1))
* f_yscale_bottom + 0.5)
f_perlins[pstr] = math.floor(f_h_min+(math.abs(perlin_f_bottom:get2d({x=p.x, y=p.z})+1))*f_yscale_bottom+0.5)
end
local top_noise = pmap_f_top[count]+1
if top_noise < 0 then
top_noise = -top_noise/10
--nether:inform("ERROR: (perlin noise) "..
-- pmap_f_top[count].." is not inside [-1; 1]", 1)
--nether:inform("ERROR: (perlin noise) "..pmap_f_top[count].." is not inside [-1; 1]", 1)
end
f_top = math.floor(f_h_max - top_noise*f_yscale_top + 0.5)
f_bottom = f_perlins[pstr]+pr:next(0,f_bottom_scale-1)
@ -494,74 +499,78 @@ minetest.register_on_generated(function(minp, maxp, seed)
end
for y=minp.y, maxp.y do
local d_p_addp = data[vi]
local p_addpos = area:index(x, y, z)
local d_p_addp = data[p_addpos]
--if py_h >= maxp.y-4 then
if y <= py_h
and noisp then
if noisp == 1 then
data[vi] = c.netherrack_brick
data[p_addpos] = c.netherrack_brick
elseif noisp == 2 then
if y == py_h then
data[vi] = c.netherrack_brick
data[p_addpos] = c.netherrack_brick
elseif y == py_h_g
and pr:next(1,3) <= 2 then
data[vi] = c.netherrack
data[p_addpos] = c.netherrack
elseif y <= py_h_g then
data[vi] = c.lava
data[p_addpos] = c.lava
else
data[vi] = c.air
data[p_addpos] = c.air
end
end
elseif d_p_addp ~= c.air then
if is_forest
and y == f_bottom then
data[vi] = c.nether_dirt_top
data[p_addpos] = c.nether_dirt_top
elseif is_forest
and y < f_bottom
and y >= f_h_dirt then
data[vi] = c.nether_dirt
data[p_addpos] = c.nether_dirt
elseif is_forest
and y == f_h_dirt-1 then
data[vi] = c.nether_dirt_bottom
data[p_addpos] = c.nether_dirt_bottom
elseif is_forest
and y == f_h_dirt+1 then
if pr:next(1,tree_rarity) == 1 then
trees[num_trees] = {x=x, y=y, z=z}
num_trees = num_trees+1
elseif pr:next(1,mushroom_rarity) == 1 then
data[vi] = c.nether_shroom
data[p_addpos] = c.nether_shroom
elseif pr:next(1,glowflower_rarity) == 1 then
data[vi] = c.glowflower
data[p_addpos] = c.glowflower
elseif pr:next(1,grass_rarity) == 1 then
data[vi] = c.nether_grass[pr:next(1,3)]
data[p_addpos] = c.nether_grass[pr:next(1,3)]
else
data[vi] = c.air
data[p_addpos] = c.air
end
elseif is_forest
and y > f_bottom
and y < f_top then
if not nether_tree_nodes[d_p_addp] then
data[vi] = c.air
if not table_contains(
{c.nether_tree, c.nether_tree_corner, c.nether_leaves, c.nether_fruit},
d_p_addp
) then
data[p_addpos] = c.air
end
elseif is_forest
and y == f_top then
local sel = math.floor(strassx[x]+strassz[z]+0.5)%10
if sel <= 5 then
data[vi] = return_nether_ore(d_p_addp, true)
data[p_addpos] = return_nether_ore(d_p_addp, true)
elseif sel == 6 then
data[vi] = c.netherrack_black
data[p_addpos] = c.netherrack_black
elseif sel == 7 then
data[vi] = c.glowstone
data[p_addpos] = c.glowstone
else
data[vi] = c.air
data[p_addpos] = c.air
end
elseif y <= NETHER_BOTTOM then
if y <= bottom then
data[vi] = return_nether_ore(d_p_addp, true)
data[p_addpos] = return_nether_ore(d_p_addp, true)
else
data[vi] = c.lava
data[p_addpos] = c.lava
end
elseif r_structure == 1
and y == bottom then
@ -569,27 +578,26 @@ minetest.register_on_generated(function(minp, maxp, seed)
num = num+1
elseif y <= bottom then
if pr:next(1,LAVA_FREQ) == 1 then
data[vi] = c.lava
data[p_addpos] = c.lava
else
data[vi] = return_nether_ore(d_p_addp, false)
data[p_addpos] = return_nether_ore(d_p_addp, false)
end
elseif r_shroom == 1
and r_structure ~= 1
and y == bottom+1 then
data[vi] = c.nether_shroom
data[p_addpos] = c.nether_shroom
elseif (y == top and r_glowstone == 1) then
data[vi] = c.glowstone
data[p_addpos] = c.glowstone
elseif y >= top then
data[vi] = return_nether_ore(d_p_addp, true)
data[p_addpos] = return_nether_ore(d_p_addp, true)
elseif y <= top-1
and generate_vine
and y >= top-r_vine_length then
data[vi] = c.nether_vine
data[p_addpos] = c.nether_vine
else
data[vi] = c.air
data[p_addpos] = c.air
end
end
vi = vi + area.ystride
end
end
end
@ -598,42 +606,37 @@ minetest.register_on_generated(function(minp, maxp, seed)
-- vm:set_lighting(12)
-- vm:calc_lighting()
-- vm:update_liquids()
vm:write_to_map(false)
vm:write_to_map()
nether:inform("nodes set", 2, t1)
local t2 = minetest.get_us_time()
local tr_bl_cnt = 0
local t2 = os.clock()
if structures_enabled then -- Blood netherstructures
tr_bl_cnt = #tab
for i = 1,tr_bl_cnt do
nether.grow_netherstructure(tab[i], true)
if structures_enabled then --Trees:
for _,v in ipairs(tab) do
nether.grow_netherstructure(v, true)
end
end
if forest_possible then -- Forest trees
tr_bl_cnt = tr_bl_cnt + #trees
for i = 1,#trees do
nether.grow_tree(trees[i], true)
if forest_possible then --Trees:
for _,v in ipairs(trees) do
nether.grow_tree(v, true)
end
end
if tr_bl_cnt > 0 then
nether:inform(tr_bl_cnt .. " trees and blood structures set", 2, t2)
end
nether:inform("trees set", 2, t2)
t2 = minetest.get_us_time()
minetest.fix_light(minp, maxp)
t2 = os.clock()
fix_light(minp, maxp)
nether:inform("light fixed", 2, t2)
nether:inform("map updated", 2, t2)
nether:inform("done", 1, t1)
end)
function nether.grow_netherstructure(pos, generated)
local t1 = minetest.get_us_time()
local t1 = os.clock()
if not contents_defined then
define_contents()
@ -650,10 +653,8 @@ function nether.grow_netherstructure(pos, generated)
local area = r_area(manip, 2, height, pos)
local nodes = manip:get_data()
local vi = area:indexp(pos)
for _ = 0, height-1 do
nodes[vi] = c.blood_stem
vi = vi + area.ystride
for i = 0, height-1 do
nodes[area:index(pos.x, pos.y+i, pos.z)] = c.blood_stem
end
for i = -1,1 do
@ -692,8 +693,9 @@ function nether.grow_netherstructure(pos, generated)
end
local poshash = minetest.hash_node_position
local pos_from_hash = minetest.get_position_from_hash
local set = vector.set_data_to_pos
local get = vector.get_data_from_pos
local remove = vector.remove_data_from_pos
local function soft_node(id)
return id == c.air or id == c.ignore
@ -731,7 +733,7 @@ local leaf_thickness = 3 --a bigger number results in more blank trees
local h_trunk_max = h_max-h_arm_max
function nether.grow_tree(pos, generated)
local t1 = minetest.get_us_time()
local t1 = os.clock()
if not contents_defined then
define_contents()
@ -774,17 +776,15 @@ function nether.grow_tree(pos, generated)
for j = 1,r do
local x = p.x+j*dir[1]
local z = p.z+j*dir[2]
trunks[poshash{x=x, y=p.y, z=z}] = dir[3]
set(trunks, z,p.y,x, dir[3])
end
r = r+1
p.x = p.x+r*dir[1]
p.z = p.z+r*dir[2]
trunk_corners[poshash(p)] = dir[4] or dir[3]
set(trunk_corners, p.z,p.y,p.x, dir[4] or dir[3])
local h = math.random(h_arm_min, h_arm_max)
for i = 1,h do
p.y = p.y + i
trunks[poshash(p)] = true
p.y = p.y - i
set(trunks, p.z,p.y+i,p.x, true)
end
p.y = p.y+h
--n = #todo+1 -- caused small trees
@ -800,16 +800,10 @@ function nether.grow_tree(pos, generated)
local fruits = {}
local trunk_ps = {}
local count = 0
local ps, trmin, trmax, trunk_count = vector.get_data_pos_table(trunks)
local ps = {}
local trunk_count = 0
for i,par2 in pairs(trunks) do
local pos = pos_from_hash(i)
update_minmax(min, max, pos)
local z,y,x = pos.z, pos.y, pos.x
trunk_count = trunk_count+1
ps[trunk_count] = {z,y,x, par2}
end
update_minmax(min, max, trmin)
update_minmax(min, max, trmax)
for _,d in pairs(ps) do
if d[4] == true then
@ -830,14 +824,13 @@ function nether.grow_tree(pos, generated)
local x = x+px
local y = y+py
local z = z+pz
local vi = poshash{x=x, y=y, z=z}
if not trunks[vi] then
if not get(trunks, z,y,x) then
if fruit_chance
and math.random(1, fruit_rarity) == 1
and math.random(1, fruit_chance) == 1 then
fruits[vi] = true
set(fruits, z,y,x, true)
else
leaves[vi] = true
set(leaves, z,y,x, true)
end
update_minmax(min, max, {x=x, z=z})
end
@ -848,12 +841,8 @@ function nether.grow_tree(pos, generated)
end
end
--ps = nil
--collectgarbage()
for i = -1,h_stem+1 do
-- param2 explicitly set 0 due to possibly previous leaves node
trunk_ps[#trunk_ps+1] = {pos.z, pos.y+i, pos.x, 0}
trunk_ps[#trunk_ps+1] = {pos.z, pos.y+i, pos.x, 0} -- par 0 because of leaves
end
local manip = minetest.get_voxel_manip()
@ -862,8 +851,8 @@ function nether.grow_tree(pos, generated)
local nodes = manip:get_data()
local param2s = manip:get_param2_data()
for i in pairs(leaves) do
local p = area:indexp(pos_from_hash(i))
for _,p in pairs(vector.get_data_pos_table(leaves)) do
p = area:index(p[3], p[2], p[1])
if soft_node(nodes[p]) then
nodes[p] = c.nether_leaves
param2s[p] = math.random(0,179)
@ -871,15 +860,14 @@ function nether.grow_tree(pos, generated)
end
end
for i in pairs(fruits) do
local p = area:indexp(pos_from_hash(i))
for _,p in pairs(vector.get_data_pos_table(fruits)) do
p = area:index(p[3], p[2], p[1])
if soft_node(nodes[p]) then
nodes[p] = c.nether_apple
end
end
for i = 1,#trunk_ps do
local p = trunk_ps[i]
for _,p in pairs(trunk_ps) do
local par = p[4]
p = area:index(p[3], p[2], p[1])
if par then
@ -888,18 +876,25 @@ function nether.grow_tree(pos, generated)
nodes[p] = c.nether_tree
end
for i,par2 in pairs(trunk_corners) do
local vi = area:indexp(pos_from_hash(i))
for _,p in pairs(vector.get_data_pos_table(trunk_corners)) do
local vi = area:index(p[3], p[2], p[1])
nodes[vi] = c.nether_tree_corner
param2s[vi] = par2
param2s[vi] = p[4]
end
manip:set_data(nodes)
manip:set_param2_data(param2s)
manip:write_to_map(not generated)
nether:inform("a nether tree with " .. trunk_count ..
" branch trunk nodes grew at " .. minetest.pos_to_string(pos),
generated and 3 or 2, t1)
manip:write_to_map()
local spam = 2
if generated then
spam = 3
end
nether:inform("a nether tree with "..trunk_count.." branch trunk nodes grew at ("..pos.x.."|"..pos.y.."|"..pos.z..")", spam, t1)
if not generated then
local t1 = os.clock()
manip:update_map()
nether:inform("map updated", spam, t1)
end
end
@ -928,8 +923,7 @@ minetest.register_abm({
action = function(pos)
if minetest.get_node({x=pos.x, y=pos.y+2, z=pos.z}).name == "air"
and minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name == "air" then
local udata = minetest.registered_nodes[
minetest.get_node{x=pos.x, y=pos.y-1, z=pos.z}.name]
local udata = minetest.registered_nodes[minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name]
if udata
and udata.groups
and udata.groups.nether_dirt then
@ -950,15 +944,13 @@ minetest.register_abm({
return
end
pos.y = pos.y+1
--mushrooms grow at dark places
if (minetest.get_node_light(pos) or 16) > 7 then
if (minetest.get_node_light(pos) or 16) > 7 then --mushrooms grow at dark places
return
end
if minetest.get_node(pos).name == "air" then
minetest.set_node(pos, {name="riesenpilz:nether_shroom"})
pos.y = pos.y-1
minetest.set_node(pos,
{name="nether:netherrack_soil", param2=par2-1})
minetest.set_node(pos, {name="nether:netherrack_soil", param2=par2-1})
end
end
})
@ -972,10 +964,6 @@ local function grass_allowed(pos)
return 0
end
local data = minetest.registered_nodes[nd]
if not data then
-- unknown node
return false
end
local drawtype = data.drawtype
if drawtype
and drawtype ~= "normal"
@ -1022,18 +1010,17 @@ minetest.register_abm({
})
minetest.register_privilege("nether",
"Allows sending players to nether and extracting them")
minetest.register_privilege("nether", "Allows sending players to nether and extracting them")
dofile(path.."/crafting.lua")
dofile(path.."/portal.lua")
dofile(path.."/guide.lua")
local time = (minetest.get_us_time() - load_time_start) / 1000000
local msg = ("[nether] loaded after ca. %g seconds."):format(time)
if time > 0.01 then
print(msg)
local time = math.floor(tonumber(os.clock()-load_time_start)*100+0.5)/100
local msg = "[nether] loaded after ca. "..time
if time > 0.05 then
minetest.log("warning", msg)
else
minetest.log("info", msg)
end

202
nether/items.lua Normal file → Executable file
View File

@ -4,27 +4,20 @@ local nether_sound = default.node_sound_stone_defaults({
footstep = {name="nether_footstep", gain=0.4}
})
-- The fence registration function from fence_registration
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 nd = "nether:"..name
if not string.find(name, "nether") then
name = "nether_"..name
end
local data = minetest.registered_nodes[nd]
if stairs_exist then
stairs.register_stair_and_slab(name, nd,
data.groups,
data.tiles,
data.description.." Stair",
data.description.." Slab",
data.sounds
)
end
stairs.register_stair_and_slab(name, nd,
data.groups,
data.tiles,
data.description.." Stair",
data.description.." Slab",
data.sounds
)
if add_fence then
add_fence({fence_of = nd})
end
@ -46,12 +39,7 @@ local function digging_allowed(player, v)
if not player then
return false
end
if minetest.is_creative_enabled(player:get_player_name()) then
return true
end
local tool = player:get_wielded_item():get_name()
tool = minetest.registered_tools[tool] or tool == ""
and minetest.registered_items[tool]
local tool = minetest.registered_tools[player:get_wielded_item():get_name()]
if not tool
or not tool.tool_capabilities then
return false
@ -216,8 +204,7 @@ add_more_nodes("blood_empty")
minetest.register_node("nether:blood_top", {
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},
sounds = default.node_sound_wood_defaults(),
})
@ -225,8 +212,7 @@ add_more_nodes("blood_top")
minetest.register_node("nether:blood_top_cooked", {
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},
sounds = nether_sound,
furnace_burntime = 10,
@ -238,8 +224,7 @@ add_more_nodes("blood_top_cooked")
minetest.register_node("nether:blood_top_empty", {
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},
sounds = default.node_sound_wood_defaults(),
})
@ -248,8 +233,7 @@ add_more_nodes("blood_top_empty")
minetest.register_node("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},
sounds = default.node_sound_wood_defaults(),
})
@ -257,8 +241,7 @@ add_more_nodes("blood_stem")
minetest.register_node("nether:blood_stem_cooked", {
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},
sounds = nether_sound,
furnace_burntime = 30,
@ -270,8 +253,7 @@ add_more_nodes("blood_stem_cooked")
minetest.register_node("nether:blood_stem_empty", {
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},
sounds = default.node_sound_wood_defaults(),
})
@ -363,10 +345,7 @@ minetest.override_item("riesenpilz:nether_shroom", {
minetest.register_node("nether:apple", {
description = "Nether Fruit",
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"},
use_texture_alpha = "opaque",
tiles = {"nether_fruit_top.png", "nether_fruit_bottom.png", "nether_fruit.png", "nether_fruit.png^[transformFX", "nether_fruit.png^[transformFX", "nether_fruit.png"},
node_box = {
type = "fixed",
fixed = {
@ -394,9 +373,21 @@ minetest.register_node("nether:apple", {
return
end
itemstack:take_item()
if nether.teleport_player(user) then
if nether_port(user, vector.round(user:getpos())) then
return itemstack
end
local p_hunger = tonumber(hbhunger.hunger[user:get_player_name()])
if not p_hunger then
return
end
p_hunger = p_hunger + 9
if p_hunger > 30 then
p_hunger = 30
end
hbhunger.hunger[user:get_player_name()] = p_hunger
hbhunger.set_hunger(user)
local amount = math.random(4, 6)
inv:add_item("main", {name="nether:blood_extracted", count=math.floor(amount/3)})
user:set_hp(user:get_hp()-amount)
@ -521,10 +512,8 @@ minetest.register_node("nether:tree", {
minetest.register_node("nether:tree_corner", {
description = "Nether Trunk Corner",
tiles = {"nether_tree.png^[transformR180", "nether_tree_top.png",
"nether_tree_corner.png^[transformFY",
"nether_tree_corner.png^[transformR180", "nether_tree.png",
"nether_tree_top.png"},
tiles = {"nether_tree.png^[transformR180", "nether_tree_top.png", "nether_tree_corner.png^[transformFY",
"nether_tree_corner.png^[transformR180", "nether_tree.png", "nether_tree_top.png"},
paramtype2 = "facedir",
is_ground_content = false,
groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,not_in_creative_inventory=1},
@ -545,7 +534,7 @@ minetest.register_node("nether:leaves", {
description = "Nether Leaves",
drawtype = "plantlike",
waving = 1,
visual_scale = math.sqrt(2) + 0.01,
visual_scale = math.sqrt(math.sqrt(2)),
tiles = {"nether_leaves.png"},
inventory_image = "nether_leaves.png",
wield_image = "nether_leaves.png",
@ -646,7 +635,7 @@ minetest.register_node("nether:portal", {
light_source = 12,
paramtype = "light",
sunlight_propagates = true,
use_texture_alpha = "blend",
use_texture_alpha = true,
walkable = false,
pointable = false,
buildable_to = false,
@ -836,51 +825,53 @@ minetest.register_craftitem("nether:hotbed", {
})
-- Modif MFF the entire tool
minetest.register_tool("nether:pick_mushroom", {
description = "Nether Mushroom Pickaxe",
inventory_image = "nether_pick_mushroom.png",
tool_capabilities = {
max_drop_level=0,
groupcaps={
cracky = {times={[3]=3}, uses=1, maxlevel=1},
nether = {times={[3]=3}, uses=1, maxlevel=1},
cracky = {times={[3]=3.0}, uses=5, maxlevel=1},
nether = {times={[3]=3}, uses=5, maxlevel=1},
},
damage_groups = {fleshy=2},
},
})
minetest.register_tool("nether:pick_wood", {
minetest.register_tool("nether:pick_wood", { -- Modif MFF the entire tool
description = "Nether Wood Pickaxe",
inventory_image = "nether_pick_wood.png",
tool_capabilities = {
full_punch_interval = 1.2,
max_drop_level=0,
groupcaps={
cracky = {times={[3]=1.6}, uses=10, maxlevel=1},
nether = {times={[2]=6, [3]=1.6}, uses=10, maxlevel=1},
cracky = {times={[3]=1.60}, uses=10, maxlevel=1},
nether = {times={[2]=6, [3]=1.60}, uses=10, maxlevel=1},
},
damage_groups = {fleshy=2},
},
})
minetest.register_tool("nether:pick_netherrack", {
minetest.register_tool("nether:pick_netherrack", { -- Modif MFF the entire tool
description = "Netherrack Pickaxe",
inventory_image = "nether_pick_netherrack.png",
tool_capabilities = {
full_punch_interval = 1.3,
full_punch_interval = 1.2,
max_drop_level=0,
groupcaps={
cracky = {times={[2]=2.0, [3]=1.20}, uses=20, maxlevel=1},
nether = {times={[1]=16, [2]=2, [3]=1.20}, uses=20, maxlevel=1},
cracky = {times={[2]=2.00, [3]=1.20}, uses=20, maxlevel=2},
nether = {times={[1]=16, [2]=2.00, [3]=1.20}, uses=20, maxlevel=1},
},
damage_groups = {fleshy=3},
},
})
minetest.register_tool("nether:pick_netherrack_blue", {
minetest.register_tool("nether:pick_netherrack_blue", { -- Modif MFF the entire tool
description = "Blue Netherrack Pickaxe",
inventory_image = "nether_pick_netherrack_blue.png",
tool_capabilities = {
full_punch_interval = 1.0,
full_punch_interval = 0.8,
max_drop_level=1,
groupcaps={
cracky = {times={[1]=4.00, [2]=1.60, [3]=0.80}, uses=30, maxlevel=2},
@ -890,60 +881,62 @@ minetest.register_tool("nether:pick_netherrack_blue", {
},
})
minetest.register_tool("nether:pick_white", {
minetest.register_tool("nether:pick_white", { -- Modif MFF the entire tool
description = "Siwtonic Pickaxe",
inventory_image = "nether_pick_white.png",
tool_capabilities = {
full_punch_interval = 0.9,
full_punch_interval = 0.5,
max_drop_level=3,
groupcaps={
cracky = {times={[1]=1, [2]=0.8, [3]=0.3}, uses=180, maxlevel=3},
nether = {times={[1]=1, [2]=0.5, [3]=0.3}, uses=180, maxlevel=3},
cracky = {times={[1]=1.75, [2]=0.85, [3]=0.40}, uses=125, maxlevel=3},
nether = {times={[1]=1, [2]=0.5, [3]=0.3}, uses=125, maxlevel=3},
},
damage_groups = {fleshy=5},
},
})
minetest.register_tool("nether:axe_netherrack", {
-- Nether Axe
minetest.register_tool("nether:axe_netherrack", { -- Modif MFF the entire tool
description = "Netherrack Axe",
inventory_image = "nether_axe_netherrack.png",
tool_capabilities = {
full_punch_interval = 1.3,
max_drop_level=0,
groupcaps={
choppy={times={[1]=2.9, [2]=1.9, [3]=1.4}, uses=20, maxlevel=1},
choppy={times={[1]=3.00, [2]=1.00, [3]=0.60}, uses=20, maxlevel=2},
},
damage_groups = {fleshy=4},
damage_groups = {fleshy=3},
},
})
minetest.register_tool("nether:axe_netherrack_blue", {
minetest.register_tool("nether:axe_netherrack_blue", { -- Modif MFF the entire tool
description = "Blue Netherrack Axe",
inventory_image = "nether_axe_netherrack_blue.png",
tool_capabilities = {
full_punch_interval = 0.9,
max_drop_level=1,
groupcaps={
choppy={times={[1]=2.5, [2]=1.5, [3]=1}, uses=30, maxlevel=2},
choppy={times={[1]=2.00, [2]=0.80, [3]=0.40}, uses=30, maxlevel=2},
},
damage_groups = {fleshy=6},
damage_groups = {fleshy=4},
},
})
minetest.register_tool("nether:axe_white", {
minetest.register_tool("nether:axe_white", { -- Modif MFF the entire tool
description = "Siwtonic Axe",
inventory_image = "nether_axe_white.png",
tool_capabilities = {
full_punch_interval = 0.9,
max_drop_level=1,
groupcaps={
choppy={times={[1]=1.2, [2]=0.5, [3]=0.3}, uses=180, maxlevel=2},
choppy={times={[1]=0.90, [2]=0.45, [3]=0.20}, uses=125, maxlevel=3},
},
damage_groups = {fleshy=8},
damage_groups = {fleshy=5},
},
})
minetest.register_tool("nether:shovel_netherrack", {
-- Nether Shovel
minetest.register_tool("nether:shovel_netherrack", { -- Modif MFF the entire tool
description = "Netherrack Shovel",
inventory_image = "nether_shovel_netherrack.png",
wield_image = "nether_shovel_netherrack.png^[transformR90",
@ -951,13 +944,13 @@ minetest.register_tool("nether:shovel_netherrack", {
full_punch_interval = 1.4,
max_drop_level=0,
groupcaps={
crumbly = {times={[1]=1.7, [2]=1.1, [3]=0.45}, uses=22, maxlevel=2},
crumbly = {times={[1]=3.30, [2]=2.20, [3]=1.32}, uses=20, maxlevel=2},
},
damage_groups = {fleshy=2},
damage_groups = {fleshy=3},
},
})
minetest.register_tool("nether:shovel_netherrack_blue", {
minetest.register_tool("nether:shovel_netherrack_blue", { -- Modif MFF the entire tool
description = "Blue Netherrack Shovel",
inventory_image = "nether_shovel_netherrack_blue.png",
wield_image = "nether_shovel_netherrack_blue.png^[transformR90",
@ -965,13 +958,13 @@ minetest.register_tool("nether:shovel_netherrack_blue", {
full_punch_interval = 1.1,
max_drop_level=1,
groupcaps={
crumbly = {times={[1]=1.4, [2]=0.8, [3]=0.35}, uses=50, maxlevel=2},
crumbly = {times={[1]=4.40, [2]=1.76, [3]=0.88}, uses=30, maxlevel=2},
},
damage_groups = {fleshy=3},
damage_groups = {fleshy=4},
},
})
minetest.register_tool("nether:shovel_white", {
minetest.register_tool("nether:shovel_white", { -- Modif MFF the entire tool
description = "Siwtonic Shovel",
inventory_image = "nether_shovel_white.png",
wield_image = "nether_shovel_white.png^[transformR90",
@ -979,56 +972,49 @@ minetest.register_tool("nether:shovel_white", {
full_punch_interval = 1,
max_drop_level=1,
groupcaps={
crumbly = {times={[1]=0.95, [2]=0.45, [3]=0.1}, uses=151, maxlevel=3},
},
damage_groups = {fleshy=4},
},
})
minetest.register_tool("nether:sword_netherrack", {
description = "Netherrack Sword",
inventory_image = "nether_sword_netherrack.png",
tool_capabilities = {
full_punch_interval = 1,
max_drop_level=0,
groupcaps={
snappy={times={[2]=1.3, [3]=0.38}, uses=40, maxlevel=1},
crumbly = {times={[1]=1.93, [2]=0.94, [3]=0.44}, uses=125, maxlevel=3},
},
damage_groups = {fleshy=5},
},
})
minetest.register_tool("nether:sword_netherrack_blue", {
description = "Blue Netherrack Sword",
inventory_image = "nether_sword_netherrack_blue.png",
-- Nether Sword
minetest.register_tool("nether:sword_netherrack", { -- Modif MFF the entire tool
description = "Netherrack Sword",
inventory_image = "nether_sword_netherrack.png",
tool_capabilities = {
full_punch_interval = 0.8,
max_drop_level=1,
full_punch_interval = 0.9,
max_drop_level=0,
groupcaps={
snappy={times={[1]=2.5, [2]=1.1, [3]=0.33}, uses=40, maxlevel=2},
snappy={times={[2]=1.3, [3]=0.38}, uses=40, maxlevel=1},
},
damage_groups = {fleshy=7},
damage_groups = {fleshy=4},
},
})
minetest.register_tool("nether:sword_white", {
description = "Siwtonic Sword",
inventory_image = "nether_sword_white.png",
wield_image = "nether_sword_white.png^[transformR90",
minetest.register_tool("nether:sword_netherrack_blue", { -- Modif MFF the entire tool
description = "Blue Netherrack Sword",
inventory_image = "nether_sword_netherrack_blue.png",
tool_capabilities = {
full_punch_interval = 0.7,
max_drop_level=1,
groupcaps={
snappy={times={[1]=1.7, [2]=0.8, [3]=0.2}, uses=100, maxlevel=3},
snappy={times={[1]=2.5, [2]=1.1, [3]=0.33}, uses=40, maxlevel=2},
},
damage_groups = {fleshy=11},
damage_groups = {fleshy=6},
},
})
-- override creative hand
if minetest.settings:get_bool("creative_mode") then
local capas = minetest.registered_items[""].tool_capabilities
capas.groupcaps.nether = capas.groupcaps.cracky
minetest.override_item("", {tool_capabilities = capas})
end
minetest.register_tool("nether:sword_white", { -- Modif MFF the entire tool
description = "Siwtonic Sword",
inventory_image = "nether_sword_white.png",
wield_image = "nether_sword_white.png^[transformR90",
tool_capabilities = {
full_punch_interval = 0.6,
max_drop_level=1,
groupcaps={
snappy={times={[1]=1.7, [2]=0.8, [3]=0.2}, uses=100, maxlevel=3},
},
damage_groups = {fleshy=8},
},
})

View File

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

26
nether/pearl.lua Normal file → Executable file
View File

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

405
nether/portal.lua Normal file → Executable file
View File

@ -2,7 +2,8 @@
-- kills the player if he uses PilzAdam portal
local portal_target = nether.buildings+1
local damage_enabled = minetest.settings:get_bool"enable_damage"
local nether_prisons = minetest.setting_getbool("enable_damage")
local obsidian_portal_kills = nether_prisons and true
local mclike_portal = false
local abm_allowed
@ -10,39 +11,43 @@ minetest.after(5, function()
abm_allowed = true
end)
local save_path = minetest.get_worldpath() .. "/nether_players"
local players_in_nether = {}
nether.spawn_point = minetest.string_to_pos(minetest.setting_get("nether_static_spawnpoint") or "")
-- If nil then we use random spawn points
-- 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")
table.icontains = table.icontains or function(t, v)
for _,i in ipairs(t) do
if i == v then
return true
end
end
return false
end
nether.players_in_nether = {}
-- only get info from file if nether prisons
if nether_prisons then
local file = io.open(minetest.get_worldpath()..'/nether_players', "r")
if file then
local contents = file:read"*all"
local contents = file:read('*all')
io.close(file)
if contents then
local playernames = string.split(contents, " ")
for i = 1,#playernames do
players_in_nether[playernames[i]] = true
end
nether.players_in_nether = string.split(contents, " ")
end
end
end
local function save_nether_players()
local playernames,n = {},1
for name in pairs(players_in_nether) do
playernames[n] = name
n = n+1
local output = ''
for _,name in ipairs(nether.players_in_nether) do
output = output..name..' '
end
local f = io.open(save_path, "w")
assert(f, "Could not open nether_players file for writing.")
f:write(table.concat(playernames, " "))
local f = io.open(minetest.get_worldpath()..'/nether_players', "w")
f:write(output)
io.close(f)
end
local update_background
if nether.trap_players then
--if nether_prisons then
function update_background(player, down)
if down then
player:set_sky({r=15, g=0, b=0}, "plain")
@ -50,96 +55,107 @@ if nether.trap_players then
player:set_sky(nil, "regular")
end
end
else
function update_background()end
end
--else
-- function update_background()end
--end
-- returns nodename if area is generated, else calls generation function
local function generated_or_generate(pos)
local node = minetest.get_node_or_nil(pos)
if node then
return node.name
local name = minetest.get_node(pos).name
if name ~= "ignore" then
return name
end
minetest.get_voxel_manip():read_from_map(pos, pos)
node = minetest.get_node_or_nil(pos)
if not node then
name = minetest.get_node_or_nil(pos)
if not name then
minetest.emerge_area(vector.subtract(pos, 80), vector.add(pos, 80))
return false
end
return node.name
return name.name
end
-- where the player appears after dying
local function get_player_died_target(player)
local target = vector.add(player:get_pos(),
{x=math.random(-100,100), y=0, z=math.random(-100,100)})
local target = vector.add(player:getpos(), {x=math.random(-100,100), y=0, z=math.random(-100,100)})
target.y = portal_target + math.random(4)
return target
end
nether.get_player_died_target = get_player_died_target
-- used for obsidian portal
local function obsidian_teleport(player, pname, target)
minetest.chat_send_player(pname, "For any reason you arrived here. Type " ..
"/nether_help to find out things like craft recipes.")
players_in_nether[pname] = true
save_nether_players()
update_background(player, true)
if target then
player:set_pos(target)
else
local function obsidian_teleport(player, pname)
minetest.chat_send_player(pname, "For any reason you arrived here. Type /nether_help to find out things like craft recipes.")
if obsidian_portal_kills then
player:set_hp(0)
return true
end
if not mclike_portal then
-- Pick random for obsidian, poor people gotta suffer
local target = vector.round(get_player_died_target(player))
if generated_or_generate(target) then
player:moveto(target)
end
return true
end
return false
end
-- teleports players to nether or helps it
local function player_to_nether(player, pos)
function nether.player_to_nether(player, safe)
local pname = player:get_player_name()
players_in_nether[pname] = true
save_nether_players()
update_background(player, true)
if pos then
player:set_pos(pos)
if table.icontains(nether.players_in_nether, pname) then
return
end
minetest.chat_send_player(pname, "For any reason you arrived here. " ..
"Type /nether_help to find out things like craft recipes.")
if nether.trap_players then
nether.players_in_nether[#nether.players_in_nether+1] = pname
save_nether_players()
if not safe then
minetest.chat_send_player(pname, "For any reason you arrived here. Type /nether_help to find out things like craft recipes.")
player:set_hp(0)
if not nether_prisons then
if nether.spawn_point then
player:moveto(nether.spawn_point)
else
player:moveto(get_player_died_target(player))
end
end
end
if not damage_enabled or not nether.trap_players then
player:set_pos(get_player_died_target(player))
end
update_background(player, true)
end
local function player_from_nether(player, pos)
function nether.player_from_nether(player)
local pname = player:get_player_name()
if players_in_nether[pname] then
players_in_nether[pname] = nil
local changes
for n,i in ipairs(nether.players_in_nether) do
if i == pname then
table.remove(nether.players_in_nether, n)
changes = true
end
end
if changes then
save_nether_players()
end
update_background(player, false)
player:set_pos(pos)
update_background(player)
end
local function player_exists(name)
local players = minetest.get_connected_players()
for i = 1,#players do
if players[i]:get_player_name() == name then
for _,player in pairs(minetest.get_connected_players()) do
if player:get_player_name() == name then
return true
end
end
return false
end
-- Chatcommands (edited) written by sss
-- Chatcommands removed
--[[ Chatcommands (edited) written by sss
minetest.register_chatcommand("to_hell", {
params = "[<player_name>]",
description = "Send someone to hell",
func = function(name, pname)
if not minetest.check_player_privs(name, {nether=true}) then
return false,
"You need the nether privilege to execute this chatcommand."
return false, "You need the nether priv to execute this chatcommand."
end
if not player_exists(pname) then
pname = name
@ -159,8 +175,7 @@ minetest.register_chatcommand("from_hell", {
description = "Extract from hell",
func = function(name, pname)
if not minetest.check_player_privs(name, {nether=true}) then
return false,
"You need the nether priv to execute this chatcommand."
return false, "You need the nether priv to execute this chatcommand."
end
if not player_exists(pname) then
pname = name
@ -170,100 +185,99 @@ minetest.register_chatcommand("from_hell", {
return false, "Something went wrong."
end
minetest.chat_send_player(pname, "You are free now")
local pos = player:get_pos()
player_from_nether(player, {x=pos.x, y=100, z=pos.z})
player_from_nether(player)
local pos = player:getpos()
local pos_togo = {x=pos.x, y=100, z=pos.z}
if minetest.setting_getbool("static_spawnpoint") ~= nil then
local stsp_conf = minetest.setting_get("static_spawnpoint")
pos_togo = {x = stsp_conf:split(",")[1]+0,y = stsp_conf:split(",")[2]+0,z = stsp_conf:split(",")[3]+0}
end
player:moveto(pos_togo)
return true, pname.." is now out of the nether."
end
})
})]]
-- Disallow teleportation and change spawn positions if the nether traps players
if nether.trap_players then
if nether_prisons then
-- randomly set player position when he/she dies in nether
minetest.register_on_respawnplayer(function(player)
local pname = player:get_player_name()
if not players_in_nether[pname] then
if not table.icontains(nether.players_in_nether, pname) then
return
end
local target = get_player_died_target(player)
player:set_pos(target)
local target
if nether.spawn_point then
target = nether.spawn_point
else
target = get_player_died_target(player)
end
player:moveto(target)
minetest.after(0, function(pname, target)
-- fixes respawn bug
local player = minetest.get_player_by_name(pname)
if player then
player:move_to(target)
player:moveto(target)
end
end, pname, target)
return true
end)
-- override set_pos etc. to disallow player teleportion by e.g. travelnet
local function can_teleport(player, pos)
if not player:is_player() then
-- the same metatable is used for entities
return true
end
local pname = player:get_player_name()
local in_nether = players_in_nether[pname] == true
-- test if the target is valid
if pos.y < nether.start then
if in_nether then
return true
-- function for teleporting players where they belong to
local function update_players()
for _,player in pairs(minetest.get_connected_players()) do
local pname = player:get_player_name()
local ppos = player:getpos()
if table.icontains(nether.players_in_nether, pname) then
if ppos.y > nether.start then
player:moveto({x=ppos.x, y=portal_target, z=ppos.z})
update_background(player, true)
--[[minetest.kick_player(pname, "\n1. Maybe you were not allowed to teleport out of the nether."..
"\n2. Maybe the server lagged."..
"\n3. please rejoin")]]
end
elseif ppos.y < nether.start then
update_background(player)
player:moveto({x=ppos.x, y=20, z=ppos.z})
--[[minetest.kick_player(pname, "\n1. Maybe you were not allowed to teleport to the nether."..
"\n2. Maybe the server lagged."..
"\n3. please rejoin")]]
end
elseif not in_nether then
return true
end
-- test if the current position is valid
local current_pos = player:get_pos()
local now_in_nether = current_pos.y < nether.start
if now_in_nether ~= in_nether then
if in_nether then
minetest.log("action", "Player \"" .. pname ..
"\" has to be in the nether, teleporting it!")
update_background(player, true)
current_pos.y = portal_target
player:set_pos(current_pos)
else
minetest.log("action", "Player \"" .. pname ..
"\" must not be in the nether, teleporting it!")
update_background(player, false)
current_pos.y = 20
player:set_pos(current_pos)
end
return false
end
minetest.chat_send_player(pname,
"You can not simply teleport to or from the nether!")
minetest.log("action", "Player \"" .. pname ..
"\" attempted to teleport from or to the nether, ignoring.")
return false
end
local methods = {"set_pos", "move_to", "setpos", "moveto"}
local metatable_overridden
minetest.register_on_joinplayer(function(player)
-- set the background when the player joins
if player:get_pos().y < nether.start then
update_background(player, true)
end
-- overide set_pos etc. if not yet done
if metatable_overridden then
return
end
metatable_overridden = true
local mt = getmetatable(player)
for i = 1,#methods do
local methodname = methods[i]
local origfunc = mt[methodname]
mt[methodname] = function(...)
if can_teleport(...) then
origfunc(...)
-- fix wrong player positions
local function tick()
update_players()
minetest.after(2, tick)
end
tick()
-- set background when player joins
minetest.register_on_joinplayer(function(player)
minetest.after(0, function(player)
if player:getpos().y < nether.start then
update_background(player, true)
end
end, player)
end)
else
-- test if player is in nether when he/she joins
minetest.register_on_joinplayer(function(player)
minetest.after(0, function(player)
local pname = player:get_player_name()
if player:getpos().y < nether.start then
if not table.icontains(nether.players_in_nether, pname) then
nether.players_in_nether[#nether.players_in_nether+1] = pname
end
return
end
for i,name in pairs(nether.players_in_nether) do
if name == pname then
nether.players_in_nether[i] = nil
return
end
end
end
end, player)
end)
end
@ -299,36 +313,29 @@ local particledef = {
-- teleports player to neter (obsidian portal)
local function obsi_teleport_player(player, pos, target)
local pname = player:get_player_name()
if players_in_nether[pname] then
if table.icontains(nether.players_in_nether, pname) then
return
end
local objpos = player:get_pos()
local objpos = player:getpos()
objpos.y = objpos.y+0.1 -- Fix some glitches at -8000
if minetest.get_node(vector.round(objpos)).name ~= "nether:portal" then
return
end
local has_teleported
if damage_enabled then
obsidian_teleport(player, pname)
has_teleported = true
elseif not mclike_portal then
local target = vector.round(get_player_died_target(player))
if generated_or_generate(target) then
obsidian_teleport(player, pname, target)
has_teleported = true
end
end
if not has_teleported then
if not obsidian_teleport(player, pname) then
-- e.g. ungenerated area
return
end
nether.players_in_nether[#nether.players_in_nether+1] = pname
save_nether_players()
update_background(player, true)
remove_portal_essence(pos)
minetest.sound_play("nether_portal_usual", {to_player=pname, gain=1})
--obj:setpos(target)
end
-- abm for particles of the obsidian portal essence and for teleporting
@ -343,8 +350,7 @@ minetest.register_abm({
end
particledef.minpos = {x=pos.x-0.25, y=pos.y-0.5, z=pos.z-0.25}
particledef.maxpos = {x=pos.x+0.25, y=pos.y+0.34, z=pos.z+0.25}
particledef.texture = "nether_portal_particle.png^[transform" ..
math.random(0, 7)
particledef.texture = "nether_portal_particle.png^[transform"..math.random(0,7)
minetest.add_particlespawner(particledef)
for _,obj in pairs(minetest.get_objects_inside_radius(pos, 1)) do
if obj:is_player() then
@ -477,7 +483,7 @@ local function make_portal(pos)
for d=0,3 do
for y=p1.y,p2.y do
local p
local p = {}
if param2 == 0 then
p = {x=p1.x+d, y=y, z=p1.z}
else
@ -556,13 +562,14 @@ minetest.after(0.1, function()
on_place = function(stack, player, pt)
if pt.under
and minetest.get_node(pt.under).name == "default:obsidian" then
--print("[nether] tries to enable a portal")
local done = make_portal(pt.under)
if done then
local pname = player:get_player_name()
minetest.chat_send_player(pname,
"Warning: If you are in the nether you may not be " ..
"able to find the way out!")
if not minetest.is_creative_enabled(pname) then
minetest.chat_send_player(
player:get_player_name(),
"Warning: If you are in the nether you may not be able to find the way out!"
)
if not minetest.setting_getbool("creative_mode") then
stack:take_item()
end
end
@ -574,7 +581,8 @@ end)
-- a not filled square
local function vector_square(r)
vector.square = vector.square or
function(r)
local tab, n = {}, 1
for i = -r+1, r do
for j = -1, 1, 2 do
@ -587,20 +595,21 @@ local function vector_square(r)
return tab
end
local function is_netherportal(pos)
-- detects if it's a portal
local function netherport(pos)
local x, y, z = pos.x, pos.y, pos.z
for _,i in pairs({-1, 3}) do
if minetest.get_node({x=x, y=y+i, z=z}).name ~= "nether:white" then
return
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"
or minetest.get_node({x=x+sn[1], y=y+3, z=z+sn[2]}).name ~= "nether:blood_cooked" then
return
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"
or minetest.get_node({x=x+sn[1], y=y+3, z=z+sn[2]}).name ~= "nether:wood_empty" then
return
@ -643,54 +652,60 @@ local function set_portal(t, z,x, y)
t[z][x] = y
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
function nether.teleport_player(player)
if not player then
minetest.log("error", "[nether] Missing player.")
function nether_port(player, pos)
if not player
or not pos
or not pos.x then
minetest.log("error", "[nether] nether_port: something failed.")
return
end
local pos = get_player_nodepos(player)
if not is_netherportal(pos) then
if not netherport(pos) then
return
end
minetest.sound_play("nether_teleporter", {to_player=player:get_player_name()}) --MFF crabman (5/09/2015) fix positional sound don't work to player
minetest.sound_play("nether_teleporter", {pos=pos})
local meta = minetest.get_meta({x=pos.x, y=pos.y-1, z=pos.z})
if pos.y < nether.start then
set_portal(known_portals_d, pos.z,pos.x, pos.y)
nether.player_from_nether(player)
local my = tonumber(meta:get_string("y"))
local y = get_portal(known_portals_u, pos.z,pos.x)
if y then
if y ~= my then
meta:set_string("y", y)
end
if minetest.setting_getbool("static_spawnpoint") then
local stsp_conf = minetest.setting_get("static_spawnpoint")
pos = minetest.string_to_pos(stsp_conf)
else
y = my or 100
local my = tonumber(meta:get_string("y"))
local y = get_portal(known_portals_u, pos.z,pos.x)
if y then
if y ~= my then
meta:set_string("y", y)
end
else
y = my or 100
end
pos.y = y
end
pos.y = y - 0.3
player_from_nether(player, pos)
player:moveto(pos)
else
set_portal(known_portals_u, pos.z,pos.x, pos.y)
local my = tonumber(meta:get_string("y"))
local y = get_portal(known_portals_d, pos.z,pos.x)
if y then
if y ~= my then
meta:set_string("y", y)
end
if nether.spawn_point then
pos = nether.spawn_point
else
y = my or portal_target+math.random(4)
end
pos.y = y - 0.3
set_portal(known_portals_u, pos.z,pos.x, pos.y)
player_to_nether(player, pos)
local my = tonumber(meta:get_string("y"))
local y = get_portal(known_portals_d, pos.z,pos.x)
if y then
if y ~= my then
meta:set_string("y", y)
end
else
y = my or portal_target+math.random(4)
end
pos.y = y
end
player:moveto(pos)
nether.player_to_nether(player, true)
end
minetest.sound_play("nether_teleporter", {pos=pos})
return true

View File

@ -1,24 +0,0 @@
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

View File

@ -1,23 +0,0 @@
# 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

BIN
nether/sounds/nether_dig.1.ogg Normal file → Executable file

Binary file not shown.

BIN
nether/sounds/nether_dig.2.ogg Normal file → Executable file

Binary file not shown.

BIN
nether/sounds/nether_dug.1.ogg Normal file → Executable file

Binary file not shown.

BIN
nether/sounds/nether_dug.2.ogg Normal file → Executable file

Binary file not shown.

BIN
nether/sounds/nether_extract_blood.1.ogg Normal file → Executable file

Binary file not shown.

BIN
nether/sounds/nether_extract_blood.2.ogg Normal file → Executable file

Binary file not shown.

BIN
nether/sounds/nether_extract_blood.3.ogg Normal file → Executable file

Binary file not shown.

BIN
nether/sounds/nether_extract_blood.4.ogg Normal file → Executable file

Binary file not shown.

BIN
nether/sounds/nether_extract_blood.5.ogg Normal file → Executable file

Binary file not shown.

BIN
nether/sounds/nether_extract_blood.6.ogg Normal file → Executable file

Binary file not shown.

BIN
nether/sounds/nether_extract_blood.7.ogg Normal file → Executable file

Binary file not shown.

BIN
nether/sounds/nether_footstep.1.ogg Normal file → Executable file

Binary file not shown.

BIN
nether/sounds/nether_footstep.2.ogg Normal file → Executable file

Binary file not shown.

BIN
nether/sounds/nether_footstep.3.ogg Normal file → Executable file

Binary file not shown.

BIN
nether/sounds/nether_pearl.ogg Normal file → Executable file

Binary file not shown.

BIN
nether/sounds/nether_portal_usual.ogg Normal file → Executable file

Binary file not shown.

BIN
nether/sounds/nether_remove_leaf.1.ogg Normal file → Executable file

Binary file not shown.

BIN
nether/sounds/nether_remove_leaf.2.ogg Normal file → Executable file

Binary file not shown.

BIN
nether/sounds/nether_remove_leaf.3.ogg Normal file → Executable file

Binary file not shown.

BIN
nether/sounds/nether_teleporter.1.ogg Normal file → Executable file

Binary file not shown.

BIN
nether/sounds/nether_teleporter.2.ogg Normal file → Executable file

Binary file not shown.

BIN
nether/sounds/nether_teleporter.3.ogg Normal file → Executable file

Binary file not shown.

0
nether/textures/nether_axe_netherrack.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 198 B

After

Width:  |  Height:  |  Size: 198 B

0
nether/textures/nether_axe_netherrack_blue.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 220 B

After

Width:  |  Height:  |  Size: 220 B

0
nether/textures/nether_axe_white.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 289 B

After

Width:  |  Height:  |  Size: 289 B

0
nether/textures/nether_bark.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 440 B

After

Width:  |  Height:  |  Size: 440 B

0
nether/textures/nether_blood.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 448 B

After

Width:  |  Height:  |  Size: 448 B

0
nether/textures/nether_blood_cooked.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 541 B

After

Width:  |  Height:  |  Size: 541 B

0
nether/textures/nether_blood_empty.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 474 B

After

Width:  |  Height:  |  Size: 474 B

0
nether/textures/nether_blood_extracted.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 303 B

After

Width:  |  Height:  |  Size: 303 B

0
nether/textures/nether_blood_extractor.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 726 B

After

Width:  |  Height:  |  Size: 726 B

0
nether/textures/nether_blood_side.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 478 B

After

Width:  |  Height:  |  Size: 478 B

0
nether/textures/nether_blood_side_cooked.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 493 B

After

Width:  |  Height:  |  Size: 493 B

0
nether/textures/nether_blood_side_empty.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 401 B

After

Width:  |  Height:  |  Size: 401 B

0
nether/textures/nether_blood_stem.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 446 B

After

Width:  |  Height:  |  Size: 446 B

0
nether/textures/nether_blood_stem_cooked.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 607 B

After

Width:  |  Height:  |  Size: 607 B

0
nether/textures/nether_blood_stem_empty.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 532 B

After

Width:  |  Height:  |  Size: 532 B

0
nether/textures/nether_blood_stem_top.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 442 B

After

Width:  |  Height:  |  Size: 442 B

0
nether/textures/nether_blood_stem_top_cooked.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 764 B

After

Width:  |  Height:  |  Size: 764 B

0
nether/textures/nether_blood_stem_top_empty.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 544 B

After

Width:  |  Height:  |  Size: 544 B

0
nether/textures/nether_blood_top.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 463 B

After

Width:  |  Height:  |  Size: 463 B

0
nether/textures/nether_blood_top_cooked.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 709 B

After

Width:  |  Height:  |  Size: 709 B

0
nether/textures/nether_blood_top_empty.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 471 B

After

Width:  |  Height:  |  Size: 471 B

0
nether/textures/nether_dirt.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 673 B

After

Width:  |  Height:  |  Size: 673 B

0
nether/textures/nether_dirt_normal.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 449 B

After

Width:  |  Height:  |  Size: 449 B

0
nether/textures/nether_dirt_top.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 699 B

After

Width:  |  Height:  |  Size: 699 B

0
nether/textures/nether_dirt_top_normal.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 481 B

After

Width:  |  Height:  |  Size: 481 B

0
nether/textures/nether_dirt_top_side.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 807 B

After

Width:  |  Height:  |  Size: 807 B

0
nether/textures/nether_dirt_top_side_normal.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 669 B

After

Width:  |  Height:  |  Size: 669 B

0
nether/textures/nether_dirt_transition.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 670 B

After

Width:  |  Height:  |  Size: 670 B

0
nether/textures/nether_dirt_transition_normal.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 528 B

After

Width:  |  Height:  |  Size: 528 B

0
nether/textures/nether_fim.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 222 B

After

Width:  |  Height:  |  Size: 222 B

0
nether/textures/nether_forest_planks.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 488 B

After

Width:  |  Height:  |  Size: 488 B

0
nether/textures/nether_forest_wood.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 775 B

After

Width:  |  Height:  |  Size: 775 B

0
nether/textures/nether_forest_wood_normal.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 550 B

After

Width:  |  Height:  |  Size: 550 B

0
nether/textures/nether_fruit.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 244 B

After

Width:  |  Height:  |  Size: 244 B

0
nether/textures/nether_fruit_bottom.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 211 B

After

Width:  |  Height:  |  Size: 211 B

0
nether/textures/nether_fruit_leaf.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 359 B

After

Width:  |  Height:  |  Size: 359 B

0
nether/textures/nether_fruit_leaves.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 519 B

After

Width:  |  Height:  |  Size: 519 B

0
nether/textures/nether_fruit_no_leaf.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 529 B

After

Width:  |  Height:  |  Size: 529 B

0
nether/textures/nether_fruit_top.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 214 B

After

Width:  |  Height:  |  Size: 214 B

0
nether/textures/nether_glowflower.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 516 B

After

Width:  |  Height:  |  Size: 516 B

0
nether/textures/nether_grass.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 184 B

After

Width:  |  Height:  |  Size: 184 B

0
nether/textures/nether_grass_big.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 352 B

After

Width:  |  Height:  |  Size: 352 B

0
nether/textures/nether_grass_dried.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 218 B

After

Width:  |  Height:  |  Size: 218 B

0
nether/textures/nether_grass_middle.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 232 B

After

Width:  |  Height:  |  Size: 232 B

0
nether/textures/nether_grass_small.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 186 B

After

Width:  |  Height:  |  Size: 186 B

0
nether/textures/nether_hotbed.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 280 B

After

Width:  |  Height:  |  Size: 280 B

0
nether/textures/nether_leaves.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 427 B

After

Width:  |  Height:  |  Size: 427 B

0
nether/textures/nether_netherrack.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 603 B

After

Width:  |  Height:  |  Size: 603 B

0
nether/textures/nether_netherrack_black.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 582 B

After

Width:  |  Height:  |  Size: 582 B

0
nether/textures/nether_netherrack_black_normal.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 490 B

After

Width:  |  Height:  |  Size: 490 B

0
nether/textures/nether_netherrack_blue.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 831 B

After

Width:  |  Height:  |  Size: 831 B

0
nether/textures/nether_netherrack_blue_normal.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 693 B

After

Width:  |  Height:  |  Size: 693 B

0
nether/textures/nether_netherrack_brick.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 682 B

After

Width:  |  Height:  |  Size: 682 B

0
nether/textures/nether_netherrack_brick_black.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 547 B

After

Width:  |  Height:  |  Size: 547 B

0
nether/textures/nether_netherrack_brick_blue.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 726 B

After

Width:  |  Height:  |  Size: 726 B

0
nether/textures/nether_netherrack_normal.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 533 B

After

Width:  |  Height:  |  Size: 533 B

0
nether/textures/nether_netherrack_soil.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 397 B

After

Width:  |  Height:  |  Size: 397 B

0
nether/textures/nether_netherrack_soil_normal.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 491 B

After

Width:  |  Height:  |  Size: 491 B

0
nether/textures/nether_netherrack_tiled.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 724 B

After

Width:  |  Height:  |  Size: 724 B

0
nether/textures/nether_netherrack_tiled_normal.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 521 B

After

Width:  |  Height:  |  Size: 521 B

0
nether/textures/nether_pearl.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 216 B

After

Width:  |  Height:  |  Size: 216 B

0
nether/textures/nether_pick_mushroom.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 375 B

After

Width:  |  Height:  |  Size: 375 B

Some files were not shown because too many files have changed in this diff Show More