Compare commits
49 Commits
Author | SHA1 | Date | |
---|---|---|---|
76708b02d5 | |||
f12d33c743 | |||
435cef6f81 | |||
01cd7c8e5b | |||
817efcdd29 | |||
6507e43dc5 | |||
27bf94c4d0 | |||
27be1dd740 | |||
c35d18a519 | |||
fb1eca6c11 | |||
be64a982f8 | |||
56f5909e0f | |||
7cdd0471a2 | |||
b876d8f2b9 | |||
870b6a9d47 | |||
0d4a302103 | |||
fadf202663 | |||
df2d49edb0 | |||
4a7dd247e7 | |||
2f3522598c | |||
020ab700ff | |||
5925dc5606 | |||
6e2ffa04ea | |||
8a3d0b0634 | |||
2ce9440fdf | |||
12dc8ae004 | |||
69b3e65c85 | |||
0a2dbbb0f8 | |||
6019bbce66 | |||
acdf694356 | |||
d32ede7e8a | |||
e8a666f34e | |||
a7da195aa1 | |||
afb77f0a1d | |||
c33e306849 | |||
dac86dae07 | |||
6d92487f20 | |||
578919c469 | |||
03da51be24 | |||
b2dd95eb50 | |||
99eceb10eb | |||
2a3e553b9c | |||
0e9bdc48b2 | |||
501ce57e59 | |||
3ba23a4c88 | |||
780b95bfbc | |||
f3cec2fe06 | |||
06099dcec3 | |||
b5807be921 |
0
.gitignore
vendored
Executable file → Normal file
@ -1,2 +1,2 @@
|
|||||||
GPLv3 (lkloel's version)
|
GPLv3 (lkloel's version)
|
||||||
WTFPL for the changes
|
MIT for the changes
|
||||||
|
29
README.md
@ -1,22 +1,11 @@
|
|||||||
[Mod] nether-pack [nether-pack]
|
For a description of this Minetest mod, please refer to the forum topic:
|
||||||
|
https://forum.minetest.net/viewtopic.php?f=9&t=10265
|
||||||
This is a modified version of lkjoel's nether mod.
|
|
||||||
Look here if you want to see the differences:
|
|
||||||
https://github.com/HybridDog/minetest-nether/compare/lkjoel:master...master
|
|
||||||
Sadly lkjoel's one disappeared…
|
|
||||||
|
|
||||||
**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
|
|
||||||

|
|
||||||
|
|
||||||
If you got ideas or found bugs, please tell them to me.
|
|
||||||
|
|
||||||
[How to install a mod?](http://wiki.minetest.net/Installing_Mods)
|
|
||||||
|
|
||||||
|
|
||||||
TODO:
|
TODO:
|
||||||
— find a way to get the perlin noise inside [-1; 1] or use another noise
|
* Mapgen: Find a way to get the perlin noise values inside [-1; 1] or use
|
||||||
— add something containing items to that buildings
|
another noise.
|
||||||
|
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
|
||||||
|
1
modpack.txt
Executable file → Normal file
@ -0,0 +1 @@
|
|||||||
|
0
|
||||||
|
17
nether/.luacheckrc
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
read_globals = {
|
||||||
|
-- Defined by Minetest
|
||||||
|
"minetest", "vector", "PseudoRandom", "VoxelArea", "ItemStack", "dump",
|
||||||
|
"string",
|
||||||
|
|
||||||
|
-- Mods
|
||||||
|
"default", "stairs"
|
||||||
|
}
|
||||||
|
globals = {"nether"}
|
||||||
|
ignore = {
|
||||||
|
"212",
|
||||||
|
-- Unused argument
|
||||||
|
"411", "421", "422", "423", "431", "432",
|
||||||
|
-- Shadowing
|
||||||
|
}
|
||||||
|
-- Allow very long lines in guide.lua for the HTML code
|
||||||
|
files["guide.lua"] = {ignore = {"631"}}
|
2
nether/crafting.lua
Executable file → Normal file
@ -197,7 +197,7 @@ minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv
|
|||||||
if not sound_allowed then -- avoid playing the sound multiple times, e.g. when middle mouse click
|
if not sound_allowed then -- avoid playing the sound multiple times, e.g. when middle mouse click
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
minetest.sound_play("default_wood_footstep", {pos=player:getpos(), gain=0.25})
|
minetest.sound_play("default_wood_footstep", {pos=player:get_pos(), gain=0.25})
|
||||||
sound_allowed = false
|
sound_allowed = false
|
||||||
minetest.after(0, function()
|
minetest.after(0, function()
|
||||||
sound_allowed = true
|
sound_allowed = true
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
default
|
|
||||||
glow
|
|
||||||
riesenpilz
|
|
||||||
stairs
|
|
||||||
vector_extras
|
|
||||||
fence_registration?
|
|
||||||
watershed?
|
|
6
nether/furnace.lua
Executable file → Normal file
@ -1,5 +1,5 @@
|
|||||||
-- minetest time speed
|
-- minetest time speed
|
||||||
local time_speed = tonumber(minetest.setting_get("time_speed"))
|
local time_speed = tonumber(minetest.settings:get("time_speed"))
|
||||||
if not time_speed then
|
if not time_speed then
|
||||||
time_speed = 1
|
time_speed = 1
|
||||||
else
|
else
|
||||||
@ -257,7 +257,7 @@ minetest.register_abm({
|
|||||||
meta:set_float("timedif", timediff-times)
|
meta:set_float("timedif", timediff-times)
|
||||||
|
|
||||||
|
|
||||||
for i = 1,times do
|
for _ = 1,times do
|
||||||
for _,name in pairs({
|
for _,name in pairs({
|
||||||
"fuel_totaltime",
|
"fuel_totaltime",
|
||||||
"fuel_time",
|
"fuel_time",
|
||||||
@ -292,7 +292,7 @@ minetest.register_abm({
|
|||||||
inv:add_item("dst", cooked.item)
|
inv:add_item("dst", cooked.item)
|
||||||
-- take stuff from "src" list
|
-- take stuff from "src" list
|
||||||
inv:set_stack("src", 1, aftercooked.items[1])
|
inv:set_stack("src", 1, aftercooked.items[1])
|
||||||
else
|
--~ else
|
||||||
--print("Could not insert '"..cooked.item:to_string().."'")
|
--print("Could not insert '"..cooked.item:to_string().."'")
|
||||||
end
|
end
|
||||||
meta:set_string("src_time", 0)
|
meta:set_string("src_time", 0)
|
||||||
|
597
nether/guide.lua
Executable file → Normal file
@ -1,362 +1,238 @@
|
|||||||
local cube = minetest.inventorycube
|
-- The content of the guide
|
||||||
|
|
||||||
-- the content of the guide
|
|
||||||
local guide_infos = {
|
local guide_infos = {
|
||||||
{
|
{"Nether Mushroom",
|
||||||
description = "Mushrooms",
|
[[Nether mushrooms can be found on the nether's ground and on Dirty Netherrack. They can be dug by hand.
|
||||||
{"text", "Nether mushrooms can be found on the nether's ground and\n"..
|
<item name=riesenpilz:nether_shroom width=100>
|
||||||
"on netherrack soil, it can be dug by hand."},
|
|
||||||
{"image", {1, 1, "riesenpilz_nether_shroom_side.png"}},
|
<my_h2><b>Crafting Items</b></my_h2>
|
||||||
{"y", 0.2},
|
If we drop a Nether mushroom without holding the fast key, we can split it into its stem and head. We can use them to craft a Nether Mushroom Pickaxe, a Nether Blood Extractor, and an uncooked Nether Pearl.
|
||||||
{"text", "If you drop it without holding the fast key, you can split it into its stem and head:"},
|
<item name=nether:shroom_head width=100> <item name=nether:shroom_stem width=100>
|
||||||
{"image", {1, 1, "nether_shroom_top.png", 1}},
|
|
||||||
{"image", {1, 1, "nether_shroom_stem.png"}},
|
<my_h2><b>Cultivating Mushrooms</b></my_h2>
|
||||||
{"y", 0.1},
|
We can get more mushrooms using Dirty Netherrack:
|
||||||
{"text", "You can get more mushrooms by using a netherrack soil:\n"..
|
1. Search a dark place (light level <= 7) and, if necessary, place Netherrack with air above it
|
||||||
"1. search a dark place and, if necessary, place netherrack with air about it\n"..
|
<img name=nether_netherrack.png width=100>
|
||||||
"2. right click with cooked blood onto the netherrack to make it soiled\n"..
|
2. Right click with Cooked Blood onto the Netherrack to turn it into Dirty Netherrack
|
||||||
"3. right click onto the netherrack soil with a nether mushroom head to add some spores\n"..
|
<item name=nether:hotbed width=100> <img name=nether_netherrack.png^nether_netherrack_soil.png width=100>
|
||||||
"4. dig the mushroom which grew after some time to make place for another one"},
|
3. Right click onto the Dirty Netherrack with a Nether mushroom head to add some spores
|
||||||
{"image", {1, 1, "riesenpilz_nether_shroom_side.png", 6, 0.12}},
|
<item name=nether:shroom_head width=100> <img name=nether_netherrack.png^nether_netherrack_soil.png width=100>
|
||||||
{"y", 1},
|
4. Wait
|
||||||
{"image", {1, 1, "nether_netherrack.png^nether_netherrack_soil.png", 1.8}},
|
5. Dig the Nether mushroom which grew after some time to make place for another one. After some time new spores need to be added (step 3).
|
||||||
{"image", {1, 1, "nether_hotbed.png", 1.3, -0.4}},
|
<img name=riesenpilz_nether_shroom_side.png width=100>
|
||||||
{"image", {1, 1, "nether_netherrack.png^nether_netherrack_soil.png", 3.6}},
|
<img name=nether_netherrack.png^nether_netherrack_soil.png width=100>
|
||||||
{"image", {1, 1, "nether_shroom_top.png", 3.1, -0.5}},
|
]]},
|
||||||
{"image", {1, 1, "nether_netherrack.png^nether_netherrack_soil.png", 6}},
|
|
||||||
{"image", {1, 1, "nether_netherrack.png"}},
|
{"Blood Structures",
|
||||||
},
|
[[We can find blood structures on the ground and dig their nodes with the bare hand. They contain four kinds of nodes: Nether Blood Stem, Nether Blood, Nether Blood Head, and Nether Fruit.
|
||||||
{
|
<item name=nether:blood_stem width=100> <item name=nether:blood width=100> <item name=nether:apple width=100>
|
||||||
description = "Tools",
|
We can craft four Nether Blood Wood nodes with the stem.
|
||||||
{"text", "You can craft 5 kinds of tools in the nether,\n"..
|
<item name=nether:wood width=100>
|
||||||
"which (except the mushroom pick) require sticks to be crafted:"},
|
The four red blood nodes can be cooked in a furnace and, except Nether Blood Wood, their blood can be extracted with a Nether Blood Extractor.
|
||||||
{"image", {1, 1, "nether_pick_mushroom.png"}},
|
|
||||||
{"y", 0.1},
|
<my_h2><b>Nether Fruit</b></my_h2>
|
||||||
{"text", "strength : 1\n"..
|
<item name=nether:apple width=100>
|
||||||
"The mushroom pick needs mushroom stems and heads to be crafted."},
|
Eating a Nether Fruit decreases life but it might work against hunger and give us blood:
|
||||||
{"image", {1, 1, "nether_pick_wood.png"}},
|
<item name=nether:blood_extracted width=100>
|
||||||
{"y", 0.1},
|
If we eat it at the right place inside a portal, we will teleport instead of getting blood.
|
||||||
{"text", "strength : 2\n"..
|
If we drop it without holding the fast key, we can split it into its fruit and leaf:
|
||||||
"The nether wood pick can be crafted with cooked nether blood wood."},
|
<item name=nether:fruit_leaf width=100> <item name=nether:fruit_no_leaf width=100>
|
||||||
{"image", {1, 1, "nether_axe_netherrack.png", 1.5}},
|
We can craft a fruit leave block out of 9 fruit leaves
|
||||||
{"image", {1, 1, "nether_shovel_netherrack.png", 3}},
|
The fruit can be used to craft a nether pearl.
|
||||||
{"image", {1, 1, "nether_sword_netherrack.png", 4.5}},
|
<item name=nether:fruit_leaves width=100>
|
||||||
{"image", {1, 1, "nether_pick_netherrack.png"}},
|
A fruit leaves block
|
||||||
{"y", 0.1},
|
|
||||||
{"text", "strength : 3\n"..
|
<my_h2><b>Cultivating Blood Structures</b></my_h2>
|
||||||
"The red netherrack tools can be crafted with usual netherrack."},
|
If we dig a Nether vine we get a Nether Blood Child. If this sapling is put in a dark place (light level <= 3) on top of a Nether Blood Head node, it grows into a new blood structure after some time.
|
||||||
{"image", {1, 1, "nether_axe_netherrack_blue.png", 1.5}},
|
<img name=nether_sapling.png width=100>
|
||||||
{"image", {1, 1, "nether_shovel_netherrack_blue.png", 3}},
|
<img name=nether_blood.png^nether_blood_side.png width=100>
|
||||||
{"image", {1, 1, "nether_sword_netherrack_blue.png", 4.5}},
|
]]},
|
||||||
{"image", {1, 1, "nether_pick_netherrack_blue.png"}},
|
|
||||||
{"y", 0.1},
|
{"Tools",
|
||||||
{"text", "strength : 3\n"..
|
[[We can craft five kinds of tools in the nether, which (except the Nether Mushroom Pickaxe) require sticks to be crafted. To obtain Nether Sticks we can use the Nether Blood Extractor.
|
||||||
"The blue netherrack tools can be crafted with blue netherrack."},
|
|
||||||
{"image", {1, 1, "nether_axe_white.png", 1.5}},
|
<my_h2><b>Nether Mushroom Pickaxe</b></my_h2>
|
||||||
{"image", {1, 1, "nether_shovel_white.png", 3}},
|
<item name=nether:pick_mushroom width=100>
|
||||||
{"image", {1, 1, "nether_sword_white.png", 4.5}},
|
Strength: 1
|
||||||
{"image", {1, 1, "nether_pick_white.png"}},
|
This pickaxe needs mushroom stems and heads to be crafted.
|
||||||
{"y", 0.1},
|
|
||||||
{"text", "strength : 3\n"..
|
<my_h2><b>Nether Wood Pickaxe</b></my_h2>
|
||||||
"The siwtonic tools can be crafted with the siwtonic ore."},
|
<item name=nether:pick_wood width=100>
|
||||||
},
|
Strength: 2
|
||||||
{
|
This pickaxe can be crafted with Cooked Nether Blood Wood.
|
||||||
description = "Blood structures",
|
|
||||||
{"text", "You can find blood structures on the ground and\n"..
|
<my_h2><b>Netherrack Tools</b></my_h2>
|
||||||
"dig their nodes even with the bare hand."},
|
<item name=nether:axe_netherrack width=100> <item name=nether:shovel_netherrack width=100> <item name=nether:sword_netherrack width=100> <item name=nether:pick_netherrack width=100>
|
||||||
{"y", 0.5},
|
Strength: 3
|
||||||
{"text", "One contains 4 kinds of blocks :"},
|
The red Netherrack tools can be crafted with usual Netherrack.
|
||||||
{"image", {1, 1, cube("nether_blood.png"), 1}},
|
|
||||||
{"image", {1, 1,
|
<my_h2><b>Faster Tools</b></my_h2>
|
||||||
cube("nether_blood_top.png", "nether_blood.png^nether_blood_side.png", "nether_blood.png^nether_blood_side.png"),
|
<item name=nether:axe_netherrack_blue width=100> <item name=nether:shovel_netherrack_blue width=100> <item name=nether:sword_netherrack_blue width=100> <item name=nether:pick_netherrack_blue width=100>
|
||||||
2}},
|
Strength: 3
|
||||||
{"image", {1, 1, "nether_fruit.png", 3}},
|
The blue Netherrack tools can be crafted with Blue Netherrack.
|
||||||
{"image", {1, 1, cube("nether_blood_stem_top.png", "nether_blood_stem.png", "nether_blood_stem.png")}},
|
|
||||||
{"y", 0.1},
|
<item name=nether:axe_white width=100> <item name=nether:shovel_white width=100> <item name=nether:sword_white width=100> <item name=nether:pick_white width=100>
|
||||||
{"text", "Blood stem, blood, blood head and nether fruit"},
|
Strength: 3
|
||||||
{"y", 0.1},
|
The Siwtonic tools can be crafted with the Siwtonic block.
|
||||||
{"text", "You can craft 4 blood wood with the stem :"},
|
]]},
|
||||||
{"image", {1, 1, cube("nether_wood.png")}},
|
|
||||||
{"y", 0.1},
|
{"Cooking",
|
||||||
{"text", "The 4 blood nodes can be cooked and, except\n"..
|
[[To get a furnace we need to dig at least 8 Netherrack Bricks. They can be found at pyramid-like constructions and require at least a strength 1 nether pickaxe to be dug.
|
||||||
"blood wood, their blood can be extracted."},
|
To begin cooking things, we can use a mushroom or fruit to power a furnace. After that it is recommended to use cooked blood nodes.
|
||||||
},
|
|
||||||
{
|
<my_h2><b>Craft Recipe</b></my_h2>
|
||||||
description = "Fruits",
|
To craft the furnace, we can use the netherrack bricks like cobble:
|
||||||
{"text", "You can find the nether fruits on blood structures\n"..
|
<item name=nether:netherrack_brick width=100> <item name=nether:netherrack_brick width=100> <item name=nether:netherrack_brick width=100>
|
||||||
"and dig them even with the bare hand."},
|
<item name=nether:netherrack_brick width=100> <img name=nether_transparent.png width=100> <item name=nether:netherrack_brick width=100>
|
||||||
{"image", {1, 1, "nether_fruit.png"}},
|
<item name=nether:netherrack_brick width=100> <item name=nether:netherrack_brick width=100> <item name=nether:netherrack_brick width=100>
|
||||||
{"text", "Eating it will make you lose life but\n"..
|
|
||||||
"it might feed you and give you blood :"},
|
<my_h2><b>Cooking Outputs</b></my_h2>
|
||||||
{"image", {1, 1, "nether_blood_extracted.png"}},
|
Some nether items can be cooked, for example the Blood Structure's nodes.
|
||||||
{"y", 0.2},
|
<item name=nether:blood_stem_cooked width=100> <item name=nether:blood_cooked width=100> <item name=nether:blood_top_cooked width=100> <item name=nether:wood_cooked width=100>
|
||||||
{"text", "If you eat it at the right place inside a portal,\n"..
|
Other cookable items are Blood and an item to get a Nether Pearl.
|
||||||
"you will teleport instead of getting blood."},
|
<item name=nether:hotbed width=100> <item name=nether:pearl width=100>
|
||||||
{"y", 0.2},
|
]]},
|
||||||
{"text", "If you drop it without holding the fast key,\n"..
|
|
||||||
"you can split it into its fruit and leaf:"},
|
{"Nether Blood Extractor",
|
||||||
{"image", {1, 1, "nether_fruit_leaf.png", 1}},
|
[[With this extractor we can separate Blood from the Blood Structure's nodes. An alternative way to get Blood is to eat Nether Fruits. The Nether Blood Extractor enables us to obtain a Nether Blood Stem Extracted, which we can craft to (empty) Nether Wood and then to Nether Sticks.
|
||||||
{"image", {1, 1, "nether_fruit_no_leaf.png"}},
|
|
||||||
{"y", 0.2},
|
<my_h2><b>Craft Recipe</b></my_h2>
|
||||||
{"text", "Craft a fruit leave block out of 9 fruit leaves\n"..
|
We can craft the Nether Blood Extractor as follows:
|
||||||
"The fruit can be used to craft a nether pearl."},
|
<item name=nether:netherrack_brick width=100> <item name=nether:blood_top_cooked width=100> <item name=nether:netherrack_brick width=100>
|
||||||
{"image", {1, 1, cube("nether_fruit_leaves.png")}},
|
<item name=nether:blood_cooked width=100> <item name=nether:shroom_stem width=100> <item name=nether:blood_cooked width=100> <img name=nether_transparent.png width=100> <item name=nether:extractor width=100>
|
||||||
{"y", 0.2},
|
<item name=nether:netherrack_brick width=100> <item name=nether:blood_stem_cooked width=100> <item name=nether:netherrack_brick width=100>
|
||||||
{"text", "A fruit leaves block"},
|
|
||||||
},
|
<my_h2><b>Usage</b></my_h2>
|
||||||
{
|
We can feed the extractor with Blood to make it separate Blood from neighbouring nodes:
|
||||||
description = "Cooking",
|
1. Place the Nether Blood Extractor somewhere
|
||||||
{"text", "To get a furnace you need to dig at least 8 netherrack bricks.\n"..
|
2. Place four or fewer Blood Structure's nodes next to it. Example viewed from the top:
|
||||||
"They can be found at pyramid like constructions and require at least\n"..
|
<img name=nether_transparent.png width=100> <img name=nether_blood_stem_top.png width=100> <img name=nether_transparent.png width=100>
|
||||||
"a strength 1 nether pick to be dug.\n"..
|
<img name=nether_blood.png width=100> <img name=nether_blood_extractor.png width=100> <img name=nether_blood.png width=100>
|
||||||
"To craft the furnace, use the netherrack bricks like cobble:"},
|
<img name=nether_transparent.png width=100> <img name=nether_blood.png width=100> <img name=nether_transparent.png width=100>
|
||||||
{"image", {0.5, 0.5, cube("nether_netherrack_brick.png"), 0.5}},
|
3. Right click the extractor with Blood to power it
|
||||||
{"image", {0.5, 0.5, cube("nether_netherrack_brick.png"), 1}},
|
<img name=nether_transparent.png width=100> <img name=nether_blood_stem_top_empty.png width=100> <img name=nether_transparent.png width=100>
|
||||||
{"image", {0.5, 0.5, cube("nether_netherrack_brick.png")}},
|
<img name=nether_blood_empty.png width=100> <img name=nether_blood_extractor.png width=100> <img name=nether_blood_empty.png width=100>
|
||||||
{"image", {0.5, 0.5, cube("nether_netherrack_brick.png"), 1}},
|
<img name=nether_transparent.png width=100> <img name=nether_blood_empty.png width=100> <img name=nether_transparent.png width=100>
|
||||||
{"image", {0.5, 0.5, cube("nether_netherrack_brick.png")}},
|
4. Take the new extracted blood and dig the extracted nodes
|
||||||
{"image", {0.5, 0.5, cube("nether_netherrack_brick.png"), 0.5}},
|
]]},
|
||||||
{"image", {0.5, 0.5, cube("nether_netherrack_brick.png"), 1}},
|
|
||||||
{"image", {0.5, 0.5, cube("nether_netherrack_brick.png")}},
|
{"Ores and Bricks",
|
||||||
{"y", 0.2},
|
[[Digging ores requires a pickaxe from the nether of a sufficient strength. Pickaxes from the overworld do not work in general.
|
||||||
{"text", "To begin cooking stuff, you can use a mushroom or fruit.\n"..
|
|
||||||
"After that it's recommended to use cooked blood nodes."},
|
<my_h2><b>Strength 1</b></my_h2>
|
||||||
{"y", 0.1},
|
<item name=glow:stone width=100>
|
||||||
{"text", "Some nether items can be cooked:"},
|
The Glowing stone can be dug with pickaxes from the overworld or a pickaxe from the nether with a strenght of least one. We can find it on the nether's and nether forest's ceiling and use it for lighting.
|
||||||
{"image", {1, 1, cube("nether_blood_stem_top_cooked.png", "nether_blood_stem_cooked.png", "nether_blood_stem_cooked.png"), 0.35}},
|
|
||||||
{"image", {1, 1, cube("nether_blood_cooked.png"), 1.6}},
|
<my_h2><b>Strength 2</b></my_h2>
|
||||||
{"image", {1, 1,
|
<item name=nether:netherrack width=100> <item name=nether:netherrack_tiled width=100> <item name=nether:netherrack_black width=100>
|
||||||
cube("nether_blood_top_cooked.png", "nether_blood_cooked.png^nether_blood_side_cooked.png", "nether_blood_cooked.png^nether_blood_side_cooked.png"),
|
The (red) Netherrack is generated like stone, Tiled Netherrack is generated like coal ore and the Black Netherrack is generated like gravel.
|
||||||
2.9}},
|
|
||||||
{"image", {1, 1, cube("nether_wood_cooked.png"), 4.3}},
|
<my_h2><b>Strength 3</b></my_h2>
|
||||||
{"y", 1.2},
|
<item name=nether:netherrack_blue width=100> <item name=nether:white width=100>
|
||||||
{"text", "Some cooked blood stem, cooked blood,\n"..
|
The Blue Netherrack is generated like diamond ore and the Siwtonic block is generated like mese blocks.
|
||||||
"cooked blood head and cooked blood wood,"},
|
|
||||||
{"image", {1, 1, "nether_hotbed.png", 0.3}},
|
<my_h2><b>Bricks</b></my_h2>
|
||||||
{"image", {1, 1, "nether_pearl.png", 2}},
|
There are three types of Bricks: red, Blue, and Black Netherrack Brick. We can craft them from the corresponding Netherrack nodes and additionally, the (red) Netherrack Brick is generated in pyramid-like structures in the nether. In comparison to the Netherrack nodes, all three Bricks can be dug with a pickaxe with strength 1.
|
||||||
{"y", 1.2},
|
<item name=nether:netherrack_brick width=100> <item name=nether:netherrack_brick_blue width=100> <item name=nether:netherrack_brick_black width=100>
|
||||||
{"text", "Some cooked extracted blood and a nether pearl"},
|
]]},
|
||||||
},
|
|
||||||
{
|
{"Nether Vines",
|
||||||
description = "Extractors",
|
[[Nether vines are at the ceiling of the nether and can be dug by hand. They drop Nether Blood Child nodes, from which we can grow Blood Structures. By feeding Blood to a Nether vine with air beneath it, it grows one node.
|
||||||
{"text", "Here you can find out information about the nether extractor."},
|
<item name=nether:vine width=100>
|
||||||
{"y", 0.2},
|
]]},
|
||||||
{"text", "Here you can see its craft recipe:"},
|
|
||||||
{"image", {0.5, 0.5, cube("nether_blood_top_cooked.png", "nether_blood_cooked.png^nether_blood_side_cooked.png", "nether_blood_cooked.png^nether_blood_side_cooked.png"), 0.5}},
|
{"Portals",
|
||||||
{"image", {0.5, 0.5, cube("nether_netherrack_brick.png"), 1}},
|
[[This nether mod supports two types of portals: the well-known Minecraft-like one made of Obsidian, and a portal which is specific to this mod. The Obsidian portal allows us to reach the nether from the overworld, but it is one-way and kills us.
|
||||||
{"image", {0.5, 0.5, cube("nether_netherrack_brick.png")}},
|
|
||||||
{"image", {0.5, 0.5, cube("nether_blood_extractor.png"), 2.5}},
|
<my_h2><b>Build Instructions</b></my_h2>
|
||||||
{"image", {0.5, 0.5, "nether_shroom_stem.png", 0.5}},
|
A nether portal requires the following nodes:
|
||||||
{"image", {0.5, 0.5, cube("nether_blood_cooked.png"), 1}},
|
<item name=nether:wood_empty width=100> <item name=nether:netherrack_black width=100> <item name=nether:netherrack_brick_blue width=100> <item name=nether:netherrack width=100> <item name=nether:blood_cooked width=100> <item name=nether:apple width=100> <item name=nether:white width=100>
|
||||||
{"image", {0.5, 0.5, cube("nether_blood_cooked.png")}},
|
* 25 (empty) Nether Wood (height 5-6)
|
||||||
{"image", {0.5, 0.5, cube("nether_blood_stem_top_cooked.png", "nether_blood_stem_cooked.png", "nether_blood_stem_cooked.png"), 0.5}},
|
* 16 Black Netherrack (height 1)
|
||||||
{"image", {0.5, 0.5, cube("nether_netherrack_brick.png"), 1}},
|
* 12 Blue Netherrack Bricks (height 2-4)
|
||||||
{"image", {0.5, 0.5, cube("nether_netherrack_brick.png")}},
|
* 8 (red) Netherrack (height 1)
|
||||||
{"y", 0.2},
|
* 8 Cooked Nether Blood (height 5)
|
||||||
{"text", "Extract blood from the blood nodes you get from the blood structures.\n"..
|
* 4 Nether Fruits (height 4)
|
||||||
"You can also get blood with a nether fruit."},
|
* 2 Siwtonic blocks (height 1 and 5)
|
||||||
{"y", 0.2},
|
|
||||||
{"text", "So you can use it:\n"..
|
The heights in parenthesis correspond to the relative vertical positions of the nodes. When built, the portal should look approximately like this one:
|
||||||
"1. place it somewhere\n"..
|
<img name=nether_teleporter.png width=600>
|
||||||
"2. place blood blocks next to it (4 or less)\n"..
|
|
||||||
"3. right click with extracted blood onto it to power it\n"..
|
<my_h2><b>Usage</b></my_h2>
|
||||||
"4. take the new extracted blood and dig the extracted nodes"},
|
Before using the portal the first time, we may want to fill our inventory with enough items so that we can build a second portal on the overworld to get back.
|
||||||
{"y", 0.2},
|
We can activate the portal as follows:
|
||||||
{"text", "Example (view from the top):"},
|
1. Stand in the middle on the Siwtonic block
|
||||||
{"y", 0.88},
|
2. Eat a Nether Fruit. If the portal was built correctly, we can hear a special sound and are teleported to the overworld.
|
||||||
{"image", {1, 1, "nether_blood_stem_top.png", 0.82, -0.88}},
|
|
||||||
{"image", {1, 1, "nether_blood.png", 1.63}},
|
If two portals in the nether and overworld have the same X and Z coordinates, they teleport us to the centre, i.e. onto the Siwtonic block, of the opposite portal when eating a Nether Fruit.
|
||||||
{"image", {1, 1, "nether_blood_extractor.png", 0.82}},
|
]]},
|
||||||
{"image", {1, 1, "nether_blood_stem_top_empty.png", 3.82, -0.88}},
|
|
||||||
{"image", {1, 1, "nether_blood_empty.png", 4.63}},
|
{"Pearls",
|
||||||
{"image", {1, 1, "nether_blood_empty.png", 3.001}},
|
[[The nether pearl can be used to teleport by throwing it.
|
||||||
{"image", {1, 1, "nether_blood_extractor.png", 3.82}},
|
|
||||||
{"image", {1, 1, "nether_blood.png"}},
|
<my_h2><b>Craft Recipe</b></my_h2>
|
||||||
{"image", {1, 1, "nether_blood.png", 0.82, -0.12}},
|
First, we need to craft two Nether Mushroom Heads and a Nether Fruit Without Leaf together as follows:
|
||||||
{"image", {1, 1, "nether_blood_empty.png", 3.82, -0.12}},
|
<item name=nether:shroom_head width=100>
|
||||||
{"y", 1.2},
|
<item name=nether:fruit_no_leaf width=100>
|
||||||
{"text", "The empty blood stem can be crafted into empty nether wood,\n"..
|
<item name=nether:shroom_head width=100>
|
||||||
"which can be crafted into nether sticks."},
|
This gives us the Nether Fruit in Mushroom (FIM), which we can cook in a furnace to obtain a Nether Pearl.
|
||||||
},
|
<item name=nether:fim width=100> <item name=nether:pearl width=100>
|
||||||
{
|
]]},
|
||||||
description = "Ores",
|
|
||||||
{"text", "You can find 5 types of ores:"},
|
{"Nether Forest",
|
||||||
{"image", {1, 1, cube("nether_netherrack_black.png"), 4}},
|
[[The nether forest is generated in caves above the nether and contains decorative plants.
|
||||||
{"image", {1, 1, cube("nether_netherrack.png")}},
|
|
||||||
{"y", 0.2},
|
<my_h2><b>Grass and Flower</b></my_h2>
|
||||||
{"text", "The red netherrack is generated like stone.\n"..
|
<item name=nether:grass_big width=100> <item name=nether:grass_middle width=100> <item name=nether:grass_small width=100>
|
||||||
"The black netherrack is generated like gravel.\n"..
|
We can craft the Nether Grass item to another grass item, which can be cooked to get Dried Nether Grass. We can then craft this dried grass to paper.
|
||||||
"Both require at least a strength 2 nether pick to be dug."},
|
|
||||||
{"image", {1, 1, cube("nether_white.png"), 4}},
|
<item name=nether:glowflower width=100>
|
||||||
{"image", {1, 1, cube("nether_netherrack_blue.png")}},
|
The Glowing Flower can be used for lighting and decoration.
|
||||||
{"y", 0.2},
|
|
||||||
{"text", "The blue netherrack is generated like diamond ore.\n"..
|
<my_h2><b>Nether Tree</b></my_h2>
|
||||||
"The siwtonic ore is generated like mese blocks.\n"..
|
<item name=nether:tree width=100>
|
||||||
"Both require at least a strength 3 nether pick to be dug."},
|
Nether trunks can be found at Nether Trees and be crafted into Nether Wood Blocks via Nether Wood Planks. Furthermore, the Nether Tree Saplings grow even in the overworld if they have Nether Dirt beneath them.
|
||||||
{"image", {1, 1, cube("nether_netherrack_tiled.png"), 4}},
|
]]}
|
||||||
{"image", {1, 1, cube("glow_stone.png")}},
|
|
||||||
{"y", 0.2},
|
|
||||||
{"text", "Glow stone can be used for lighting.\n"..
|
|
||||||
"Tiled netherrack is generated like coal ore.\n"..
|
|
||||||
"Glow stone requires at least a strength 1 pick to be dug.\n"..
|
|
||||||
"Dig tiled netherrack with at least a level 2 pickaxe."},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description = "Vines",
|
|
||||||
{"text", "Feed nether vines with blood.\n"..
|
|
||||||
"Dig them with anything."},
|
|
||||||
{"image", {1, 1, "nether_vine.png"}},
|
|
||||||
{"y", 0.2},
|
|
||||||
{"text", "Grow nether child by placing\n"..
|
|
||||||
"placing it to a dark place onto a\n"..
|
|
||||||
"blood structure head node."},
|
|
||||||
{"image", {1, 1, "nether_sapling.png"}},
|
|
||||||
{"y", -0.10},
|
|
||||||
{"image", {1, 1, "nether_blood.png^nether_blood_side.png"}},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description = "Pearls",
|
|
||||||
{"text", "The nether pearl can be used to teleport by throwing it.\n"..
|
|
||||||
"Here is how to get one :"},
|
|
||||||
{"y", 0.2},
|
|
||||||
{"text", "First of all craft 2 mushroom heads and 1 nether fruit\n"..
|
|
||||||
"without leaf together :"},
|
|
||||||
{"image", {1, 1, "nether_shroom_top.png"}},
|
|
||||||
{"image", {1, 1, "nether_fim.png", 3}},
|
|
||||||
{"image", {1, 1, "nether_fruit_no_leaf.png"}},
|
|
||||||
{"image", {1, 1, "nether_shroom_top.png"}},
|
|
||||||
{"y", 0.2},
|
|
||||||
{"text", "Put the result into the furnace\n"..
|
|
||||||
"to cook it into a nether pearl :"},
|
|
||||||
{"image", {1, 1, "nether_pearl.png"}},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description = "Bricks",
|
|
||||||
{"text", "Craft bricks out of red,\n"..
|
|
||||||
"black and blue netherrack."},
|
|
||||||
{"image", {1, 1, cube("nether_netherrack_brick_black.png"), 1}},
|
|
||||||
{"image", {1, 1, cube("nether_netherrack_brick_blue.png"), 2}},
|
|
||||||
{"image", {1, 1, cube("nether_netherrack_brick.png")}},
|
|
||||||
{"y", 0.4},
|
|
||||||
{"text", "Dig them with at least a level 1 pickaxe."},
|
|
||||||
{"y", 0.2},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description = "Portals",
|
|
||||||
{"text", "Here you can find out how to built the nether portal."},
|
|
||||||
{"y", 0.3},
|
|
||||||
{"text", "A nether portal requires following nodes:"},
|
|
||||||
{"y", 0.05},
|
|
||||||
{"text", "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 size of guide pages
|
-- The guide formspecs
|
||||||
local guide_size = {x=40, y=10, cx=0.2, cy=0.2}
|
local guide_forms = {}
|
||||||
|
|
||||||
-- informations about settings and ...
|
-- Convert the guide content to formspecs
|
||||||
local formspec_offset = {x=0.25, y=0.50}
|
|
||||||
local font_size
|
|
||||||
if minetest.is_singleplayer() then
|
|
||||||
font_size = tonumber(minetest.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
|
for n,data in ipairs(guide_infos) do
|
||||||
local form = ""
|
local title, html_content = data[1], data[2]
|
||||||
local y = 0
|
--~ local html_text = "<global background=#242424 size=24><tag name=my_h1 size=35>" ..
|
||||||
local x = guide_size.cx
|
local html_text = "<global size=24><tag name=my_h1 size=35>" ..
|
||||||
for _,i in ipairs(data) do
|
"<tag name=my_h2 size=30>" ..
|
||||||
local typ, content = unpack(i)
|
"<my_h1><b><center>" .. title .. "</b></center></my_h1>\n" ..
|
||||||
if typ == "y" then
|
html_content
|
||||||
y = y+content
|
local spec_width = 16
|
||||||
elseif typ == "x" then
|
local spec_height = 16
|
||||||
x = math.max(x, content)
|
local html_padding = 0.5
|
||||||
elseif typ == "text" then
|
local form = ("formspec_version[4]size[%g,%g;]" ..
|
||||||
--local tab = minetest.splittext(content, guide_size.fx)
|
"hypertext[%g,%g;%g,%g;html;%s]button[%g,%g;2,0.8;quit;Back]"
|
||||||
local l = guide_size.cx
|
):format(
|
||||||
--[[for _,str in ipairs(tab) do
|
spec_width, spec_height,
|
||||||
form = form.."label["..guide_size.cx ..","..guide_size.cy+y..";"..str.."]"
|
html_padding, html_padding,
|
||||||
y = y+guide_size.fy
|
spec_width - 2 * html_padding, spec_height - 1 - 2 * html_padding,
|
||||||
l = math.max(l, #str)
|
minetest.formspec_escape(html_text),
|
||||||
end]]
|
0.5 * spec_width - 1, spec_height - 1)
|
||||||
x = math.max(x, l/font_size)
|
|
||||||
elseif typ == "image" then
|
guide_forms[n] = {title, form}
|
||||||
local w, h, texture_name, px, py = unpack(content)
|
|
||||||
if not px then
|
|
||||||
form = form.."image["..guide_size.cx..","..guide_size.cy+y+h*0.3 ..";"..w..","..h..";"..texture_name.."]"
|
|
||||||
y = y+h
|
|
||||||
else
|
|
||||||
px = guide_size.cx+px
|
|
||||||
py = py or 0
|
|
||||||
form = form.."image["..px..","..
|
|
||||||
guide_size.cy+y+h*0.3+py ..";"..w..","..h..";"..texture_name.."]"
|
|
||||||
x = math.max(x, px+w)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
form = "size["..x*1.8 ..","..y+1 ..";]"..form.."button["..x/2-0.5 ..","..y ..";1,2;quit;Back]"
|
|
||||||
guide_forms[n] = {data.description, form}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local desc_tab = {}
|
local title_to_index = {}
|
||||||
for n,i in ipairs(guide_forms) do
|
for n, i in ipairs(guide_forms) do
|
||||||
desc_tab[i[1]] = n
|
title_to_index[i[1]] = n
|
||||||
end
|
end
|
||||||
|
|
||||||
-- creates contents formspec
|
-- Create the contents formspec
|
||||||
local y = 0
|
guide_forms.contents = "formspec_version[4]size[6," .. (#guide_infos) + 2 ..
|
||||||
for y,i in ipairs(guide_forms) do
|
";]label[2,0.8;Contents:]"
|
||||||
local desc, form = unpack(i)
|
for i, data in ipairs(guide_forms) do
|
||||||
local s = #desc*1.3/font_size+1.5
|
local desc = data[1]
|
||||||
guide_forms.contents = guide_forms.contents.."button["..guide_size.cx*12/s-0.5 ..","..guide_size.cy+y/1.3 ..";"..s..",1;name;"..desc.."]"
|
local y = i + 0.5 + 0.1
|
||||||
end
|
guide_forms.contents = guide_forms.contents ..
|
||||||
|
"button[0.5," .. y .. ";5,0.8;name;" .. desc .. "]"
|
||||||
-- shows the contents of the formspec
|
|
||||||
local function show_guide(pname)
|
|
||||||
minetest.show_formspec(pname, "nether_guide_contents", guide_forms["contents"])
|
|
||||||
end
|
end
|
||||||
|
|
||||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||||
@ -365,14 +241,16 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
|||||||
local pname = player:get_player_name()
|
local pname = player:get_player_name()
|
||||||
if fname
|
if fname
|
||||||
and pname then
|
and pname then
|
||||||
minetest.show_formspec(pname, "nether_guide", guide_forms[desc_tab[fname]][2])
|
minetest.show_formspec(pname, "nether_guide",
|
||||||
|
guide_forms[title_to_index[fname]][2])
|
||||||
end
|
end
|
||||||
elseif formname == "nether_guide" then
|
elseif formname == "nether_guide" then
|
||||||
local fname = fields.quit
|
local fname = fields.quit
|
||||||
local pname = player:get_player_name()
|
local pname = player:get_player_name()
|
||||||
if fname
|
if fname
|
||||||
and pname then
|
and pname then
|
||||||
minetest.show_formspec(pname, "nether_guide_contents", guide_forms["contents"])
|
minetest.show_formspec(pname, "nether_guide_contents",
|
||||||
|
guide_forms["contents"])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
@ -383,15 +261,16 @@ minetest.register_chatcommand("nether_help", {
|
|||||||
func = function(name)
|
func = function(name)
|
||||||
local player = minetest.get_player_by_name(name)
|
local player = minetest.get_player_by_name(name)
|
||||||
if not player then
|
if not player then
|
||||||
minetest.chat_send_player(name, "Something went wrong.")
|
return false, "Something went wrong."
|
||||||
return false
|
end
|
||||||
|
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."
|
||||||
end
|
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...")
|
minetest.chat_send_player(name, "Showing guide...")
|
||||||
show_guide(name)
|
-- Show the Contents (overview) page
|
||||||
|
minetest.show_formspec(name, "nether_guide_contents",
|
||||||
|
guide_forms["contents"])
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
401
nether/init.lua
Executable file → Normal file
@ -11,7 +11,7 @@
|
|||||||
-- godkiller447 (ideas)
|
-- godkiller447 (ideas)
|
||||||
-- If I didn't list you, please let me know!
|
-- If I didn't list you, please let me know!
|
||||||
|
|
||||||
local load_time_start = os.clock()
|
local load_time_start = minetest.get_us_time()
|
||||||
|
|
||||||
if not rawget(_G, "nether") then
|
if not rawget(_G, "nether") then
|
||||||
nether = {}
|
nether = {}
|
||||||
@ -19,15 +19,6 @@ end
|
|||||||
|
|
||||||
--== EDITABLE OPTIONS ==--
|
--== EDITABLE OPTIONS ==--
|
||||||
|
|
||||||
--says some information.
|
|
||||||
nether.info = true
|
|
||||||
|
|
||||||
-- tell everyone about the generation
|
|
||||||
nether.inform_all = minetest.is_singleplayer()
|
|
||||||
|
|
||||||
--1:<a bit of information> 2:<acceptable amount of information> 3:<lots of text>
|
|
||||||
nether.max_spam = 2
|
|
||||||
|
|
||||||
-- Depth of the nether
|
-- Depth of the nether
|
||||||
local nether_middle = -20000
|
local nether_middle = -20000
|
||||||
|
|
||||||
@ -52,9 +43,6 @@ local grass_rarity = 2
|
|||||||
-- Frequency of nether mushrooms in the nether forest (higher is less frequent)
|
-- Frequency of nether mushrooms in the nether forest (higher is less frequent)
|
||||||
local mushroom_rarity = 80
|
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_interval = 864
|
||||||
local abm_tree_chance = 100
|
local abm_tree_chance = 100
|
||||||
|
|
||||||
@ -65,7 +53,7 @@ nether.start = f_h_max+100
|
|||||||
local NETHER_HEIGHT = 30
|
local NETHER_HEIGHT = 30
|
||||||
|
|
||||||
-- Maximum amount of randomness in the map generation
|
-- Maximum amount of randomness in the map generation
|
||||||
NETHER_RANDOM = 2
|
local NETHER_RANDOM = 2
|
||||||
|
|
||||||
-- Frequency of Glowstone on the "roof" of the Nether (higher is less frequent)
|
-- Frequency of Glowstone on the "roof" of the Nether (higher is less frequent)
|
||||||
local GLOWSTONE_FREQ_ROOF = 500
|
local GLOWSTONE_FREQ_ROOF = 500
|
||||||
@ -86,63 +74,60 @@ local NETHER_SHROOM_FREQ = 100
|
|||||||
--NETHER_APPLE_FREQ = 5
|
--NETHER_APPLE_FREQ = 5
|
||||||
-- Frequency of healing apples in a nether structure (higher is less frequent)
|
-- Frequency of healing apples in a nether structure (higher is less frequent)
|
||||||
--NETHER_HEAL_APPLE_FREQ = 10
|
--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}
|
--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}
|
--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 ==--
|
--== END OF EDITABLE OPTIONS ==--
|
||||||
|
|
||||||
if nether.info then
|
local path = minetest.get_modpath"nether"
|
||||||
|
dofile(path .. "/settings.lua")
|
||||||
|
local nether_weird_noise = dofile(path .. "/weird_mapgen_noise.lua")
|
||||||
|
dofile(path .. "/items.lua")
|
||||||
|
--dofile(path .. "/furnace.lua")
|
||||||
|
dofile(path .. "/pearl.lua")
|
||||||
|
|
||||||
|
|
||||||
|
if nether.log_level >= 1 then
|
||||||
function nether:inform(msg, spam, t)
|
function nether:inform(msg, spam, t)
|
||||||
if spam <= self.max_spam then
|
if spam <= self.log_level then
|
||||||
local info
|
local info
|
||||||
if t then
|
if t then
|
||||||
info = string.format("[nether] "..msg.." after ca. %.2fs", os.clock() - t)
|
info = "[nether] " .. msg .. (" after ca. %.3g s"):format(
|
||||||
|
(minetest.get_us_time() - t) / 1000000)
|
||||||
else
|
else
|
||||||
info = "[nether] "..msg
|
info = "[nether] " .. msg
|
||||||
end
|
end
|
||||||
minetest.log("action", info)
|
print(info)
|
||||||
if self.inform_all then
|
if self.log_to_chat then
|
||||||
minetest.chat_send_all(info)
|
minetest.chat_send_all(info)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
function nether:inform()
|
function nether.inform()
|
||||||
end
|
end
|
||||||
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
|
-- Weierstrass function stuff from https://github.com/slemonide/gen
|
||||||
local SIZE = 1000
|
local SIZE = 1000
|
||||||
local ssize = math.ceil(math.abs(SIZE))
|
local ssize = math.ceil(math.abs(SIZE))
|
||||||
local function do_ws_func(depth, a, x)
|
local function do_ws_func(depth, a, x)
|
||||||
local n = x/(16*SIZE)
|
local n = math.pi * x / (16 * SIZE)
|
||||||
local y = 0
|
local y = 0
|
||||||
for k=1,depth do
|
for k=1,depth do
|
||||||
y = y + math.sin(math.pi * k^a * n)/(k^a)
|
y = y + math.sin(k^a * n) / k^a
|
||||||
end
|
end
|
||||||
return SIZE*y/math.pi
|
return SIZE * y / math.pi
|
||||||
end
|
end
|
||||||
|
|
||||||
local chunksize = minetest.setting_get("chunksize") or 5
|
local chunksize = minetest.settings:get"chunksize" or 5
|
||||||
local ws_lists = {}
|
local ws_lists = {}
|
||||||
local function get_ws_list(a,x)
|
local function get_ws_list(a,x)
|
||||||
ws_lists[a] = ws_lists[a] or {}
|
ws_lists[a] = ws_lists[a] or {}
|
||||||
@ -161,10 +146,6 @@ end
|
|||||||
|
|
||||||
|
|
||||||
local function dif(z1, z2)
|
local function dif(z1, z2)
|
||||||
if z1 < 0
|
|
||||||
and z2 < 0 then
|
|
||||||
z1,z2 = -z1,-z2
|
|
||||||
end
|
|
||||||
return math.abs(z1-z2)
|
return math.abs(z1-z2)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -182,43 +163,25 @@ end
|
|||||||
|
|
||||||
local function set_vm_data(manip, nodes, pos, t1, name, generated)
|
local function set_vm_data(manip, nodes, pos, t1, name, generated)
|
||||||
manip:set_data(nodes)
|
manip:set_data(nodes)
|
||||||
manip:write_to_map()
|
manip:write_to_map(not generated)
|
||||||
local spam = 2
|
nether:inform(name.." grew at " .. minetest.pos_to_string(pos),
|
||||||
if generated then
|
generated and 3 or 2, t1)
|
||||||
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
|
end
|
||||||
|
|
||||||
-- Generated variables
|
-- Generated variables
|
||||||
local NETHER_BOTTOM = (nether_middle - NETHER_HEIGHT)
|
local NETHER_BOTTOM = (nether_middle - NETHER_HEIGHT)
|
||||||
nether.buildings = NETHER_BOTTOM+12
|
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_top = (f_h_max-f_h_min)/2
|
||||||
local f_yscale_bottom = f_yscale_top/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)
|
--LAVA_Y = (NETHER_BOTTOM + LAVA_HEIGHT)
|
||||||
--HADES_THRONE_ABS = {}
|
--HADES_THRONE_ABS = {}
|
||||||
--HADES_THRONE_ENDPOS_ABS = {}
|
--HADES_THRONE_ENDPOS_ABS = {}
|
||||||
--HADES_THRONE_GENERATED = minetest.get_worldpath() .. "/netherhadesthrone.txt"
|
--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
|
--[[for i,v in ipairs(HADES_THRONE) do
|
||||||
v.pos.x = v.pos.x + HADES_THRONE_STARTPOS_ABS.x
|
v.pos.x = v.pos.x + HADES_THRONE_STARTPOS_ABS.x
|
||||||
v.pos.y = v.pos.y + HADES_THRONE_STARTPOS_ABS.y
|
v.pos.y = v.pos.y + HADES_THRONE_STARTPOS_ABS.y
|
||||||
@ -241,7 +204,7 @@ for i,v in ipairs(HADES_THRONE_ABS) do
|
|||||||
end
|
end
|
||||||
HADES_THRONE_ENDPOS_ABS = {x=htx, y=hty, z=htz}]]
|
HADES_THRONE_ENDPOS_ABS = {x=htx, y=hty, z=htz}]]
|
||||||
|
|
||||||
local c
|
local c, nether_tree_nodes
|
||||||
local function define_contents()
|
local function define_contents()
|
||||||
c = {
|
c = {
|
||||||
ignore = minetest.get_content_id("ignore"),
|
ignore = minetest.get_content_id("ignore"),
|
||||||
@ -252,7 +215,8 @@ local function define_contents()
|
|||||||
diamond = minetest.get_content_id("default:stone_with_diamond"),
|
diamond = minetest.get_content_id("default:stone_with_diamond"),
|
||||||
mese = minetest.get_content_id("default:mese"),
|
mese = minetest.get_content_id("default:mese"),
|
||||||
|
|
||||||
glowstone = minetest.get_content_id("glow:stone"), --https://github.com/Zeg9/minetest-glow
|
--https://github.com/Zeg9/minetest-glow
|
||||||
|
glowstone = minetest.get_content_id("glow:stone"),
|
||||||
|
|
||||||
nether_shroom = minetest.get_content_id("riesenpilz:nether_shroom"),
|
nether_shroom = minetest.get_content_id("riesenpilz:nether_shroom"),
|
||||||
|
|
||||||
@ -282,6 +246,12 @@ local function define_contents()
|
|||||||
nether_dirt_top = minetest.get_content_id("nether:dirt_top"),
|
nether_dirt_top = minetest.get_content_id("nether:dirt_top"),
|
||||||
nether_dirt_bottom = minetest.get_content_id("nether:dirt_bottom"),
|
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
|
end
|
||||||
|
|
||||||
local pr, contents_defined
|
local pr, contents_defined
|
||||||
@ -308,13 +278,14 @@ end
|
|||||||
|
|
||||||
local f_perlins = {}
|
local f_perlins = {}
|
||||||
|
|
||||||
--local perlin1 = minetest.get_perlin(13,3, 0.5, 50) --Get map specific perlin
|
-- abs(v) < 1-(persistance^octaves))/(1-persistance) = amp
|
||||||
|
--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 perlin2 = minetest.get_perlin(133,3, 0.5, 10)
|
||||||
-- local perlin3 = minetest.get_perlin(112,3, 0.5, 5)
|
-- local perlin3 = minetest.get_perlin(112,3, 0.5, 5)
|
||||||
local tmp = f_yscale_top*4
|
local tmp = f_yscale_top*4
|
||||||
local tmp2 = tmp/f_bottom_scale
|
local tmp2 = tmp/f_bottom_scale
|
||||||
local perlins = {
|
local perlins = {
|
||||||
{
|
{ -- amp 1.75
|
||||||
seed = 13,
|
seed = 13,
|
||||||
octaves = 3,
|
octaves = 3,
|
||||||
persist = 0.5,
|
persist = 0.5,
|
||||||
@ -322,7 +293,7 @@ local perlins = {
|
|||||||
scale = 1,
|
scale = 1,
|
||||||
offset = 0,
|
offset = 0,
|
||||||
},
|
},
|
||||||
{
|
{-- amp 1.75
|
||||||
seed = 133,
|
seed = 133,
|
||||||
octaves = 3,
|
octaves = 3,
|
||||||
persist = 0.5,
|
persist = 0.5,
|
||||||
@ -330,7 +301,7 @@ local perlins = {
|
|||||||
scale = 1,
|
scale = 1,
|
||||||
offset = 0,
|
offset = 0,
|
||||||
},
|
},
|
||||||
{
|
{-- amp 1.75
|
||||||
seed = 112,
|
seed = 112,
|
||||||
octaves = 3,
|
octaves = 3,
|
||||||
persist = 0.5,
|
persist = 0.5,
|
||||||
@ -346,7 +317,7 @@ local perlins = {
|
|||||||
scale = 1,
|
scale = 1,
|
||||||
offset = 0,
|
offset = 0,
|
||||||
},]]
|
},]]
|
||||||
forest_top = {
|
forest_top = {-- amp 2.44
|
||||||
seed = 21,
|
seed = 21,
|
||||||
octaves = 3,
|
octaves = 3,
|
||||||
persist = 0.8,
|
persist = 0.8,
|
||||||
@ -356,18 +327,26 @@ local perlins = {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
local info = true
|
-- 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 structures_enabled = true
|
local structures_enabled = true
|
||||||
local vine_maxlength = math.floor(NETHER_HEIGHT/4+0.5)
|
local vine_maxlength = math.floor(NETHER_HEIGHT/4+0.5)
|
||||||
-- Create the Nether
|
-- Create the Nether
|
||||||
minetest.register_on_generated(function(minp, maxp, seed)
|
minetest.register_on_generated(function(minp, maxp, seed)
|
||||||
if not (maxp.y >= NETHER_BOTTOM-100 and minp.y <= nether.start) then --avoid big map generation
|
--avoid big map generation
|
||||||
|
if not (maxp.y >= NETHER_BOTTOM-100 and minp.y <= nether.start) then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
local addpos = {}
|
|
||||||
|
|
||||||
local t1 = os.clock()
|
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)
|
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
|
if not contents_defined then
|
||||||
define_contents()
|
define_contents()
|
||||||
@ -382,39 +361,50 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
|
local vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
|
||||||
local data = vm:get_data()
|
vm:get_data(data)
|
||||||
local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax}
|
local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax}
|
||||||
|
|
||||||
pr = PseudoRandom(seed+33)
|
pr = PseudoRandom(seed+33)
|
||||||
local tab,num = {},1
|
local tab,num = {},1
|
||||||
local trees,num_trees = {},1
|
local trees,num_trees = {},1
|
||||||
|
|
||||||
--local perlin1 = minetest.get_perlin(13,3, 0.5, 50) --Get map specific perlin
|
--local perlin1 = minetest.get_perlin(13,3, 0.5, 50)
|
||||||
--local perlin2 = minetest.get_perlin(133,3, 0.5, 10)
|
--local perlin2 = minetest.get_perlin(133,3, 0.5, 10)
|
||||||
--local perlin3 = minetest.get_perlin(112,3, 0.5, 5)
|
--local perlin3 = minetest.get_perlin(112,3, 0.5, 5)
|
||||||
|
|
||||||
local side_length = maxp.x - minp.x + 1 -- maybe mistake here
|
local side_length = maxp.x - minp.x + 1
|
||||||
local map_lengths_xyz = {x=side_length, y=side_length, z=side_length}
|
local map_lengths_xyz = {x=side_length, y=side_length, z=side_length}
|
||||||
|
|
||||||
local pmap1 = minetest.get_perlin_map(perlins[1], map_lengths_xyz):get2dMap_flat({x=minp.x, y=minp.z})
|
if not pelin_maps then
|
||||||
local pmap2 = minetest.get_perlin_map(perlins[2], map_lengths_xyz):get2dMap_flat({x=minp.x, y=minp.z})
|
pelin_maps = {
|
||||||
local pmap3 = minetest.get_perlin_map(perlins[3], map_lengths_xyz):get2dMap_flat({x=minp.x, y=minp.z})
|
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 forest_possible = maxp.y > f_h_min and minp.y < f_h_max
|
local forest_possible = maxp.y > f_h_min and minp.y < f_h_max
|
||||||
|
|
||||||
--local pmap_f_bottom = minetest.get_perlin_map(perlins.forest_bottom, map_lengths_xyz):get2dMap_flat({x=minp.x, y=minp.z})
|
--local pmap_f_bottom = minetest.get_perlin_map(perlins.forest_bottom,
|
||||||
local perlin_f_bottom, pmap_f_top, strassx, strassz
|
-- map_lengths_xyz):get_2d_map_flat({x=minp.x, y=minp.z})
|
||||||
|
local perlin_f_bottom, strassx, strassz
|
||||||
if forest_possible then
|
if forest_possible then
|
||||||
perlin_f_bottom = minetest.get_perlin(11, 3, 0.8, tmp2)
|
perlin_f_bottom = minetest.get_perlin(11, 3, 0.8, tmp2)
|
||||||
pmap_f_top = minetest.get_perlin_map(perlins.forest_top, map_lengths_xyz):get2dMap_flat({x=minp.x, y=minp.z})
|
pelin_maps.forest_top:get_2d_map_flat({x=minp.x, y=minp.z}, pmap_f_top)
|
||||||
strassx = get_ws_list(2, minp.x, side_length)
|
strassx = get_ws_list(2, minp.x)
|
||||||
strassz = get_ws_list(2, minp.z, side_length)
|
strassz = get_ws_list(2, minp.z)
|
||||||
end
|
end
|
||||||
|
|
||||||
local num2, tab2
|
local num2, tab2
|
||||||
if buildings >= 1 then
|
if buildings >= 1 then
|
||||||
num2 = 1
|
num2 = 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)
|
tab2 = nether_weird_noise({x=minp.x, y=nether.buildings-79, z=minp.z},
|
||||||
|
pymg, 200, 8, 10, side_length-1)
|
||||||
end
|
end
|
||||||
|
|
||||||
local count = 0
|
local count = 0
|
||||||
@ -460,17 +450,18 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
|||||||
py_h_g = nether.buildings-7
|
py_h_g = nether.buildings-7
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local vi = area:index(x, minp.y, z)
|
||||||
if buildings == 1
|
if buildings == 1
|
||||||
and noisp then
|
and noisp then
|
||||||
if noisp == 1 then
|
if noisp == 1 then
|
||||||
for y=minp.y, maxp.y do
|
for _ = 1,side_length do
|
||||||
local p_addpos = area:index(x, y, z)
|
data[vi] = c.netherrack_brick
|
||||||
data[p_addpos] = c.netherrack_brick
|
vi = vi + area.ystride
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
for y=minp.y, maxp.y do
|
for _ = 1,side_length do
|
||||||
local p_addpos = area:index(x, y, z)
|
data[vi] = c.lava
|
||||||
data[p_addpos] = c.lava
|
vi = vi + area.ystride
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
@ -482,15 +473,19 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
|||||||
|
|
||||||
local f_bottom, f_top, is_forest, f_h_dirt
|
local f_bottom, f_top, is_forest, f_h_dirt
|
||||||
if forest_possible then
|
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
|
local pstr = p.x.." "..p.z
|
||||||
if not f_perlins[pstr] then
|
if not f_perlins[pstr] then
|
||||||
f_perlins[pstr] = math.floor(f_h_min+(math.abs(perlin_f_bottom:get2d({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:get_2d{x=p.x, y=p.z} + 1))
|
||||||
|
* f_yscale_bottom + 0.5)
|
||||||
end
|
end
|
||||||
local top_noise = pmap_f_top[count]+1
|
local top_noise = pmap_f_top[count]+1
|
||||||
if top_noise < 0 then
|
if top_noise < 0 then
|
||||||
top_noise = -top_noise/10
|
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
|
end
|
||||||
f_top = math.floor(f_h_max - top_noise*f_yscale_top + 0.5)
|
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)
|
f_bottom = f_perlins[pstr]+pr:next(0,f_bottom_scale-1)
|
||||||
@ -499,78 +494,74 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
|||||||
end
|
end
|
||||||
|
|
||||||
for y=minp.y, maxp.y do
|
for y=minp.y, maxp.y do
|
||||||
local p_addpos = area:index(x, y, z)
|
local d_p_addp = data[vi]
|
||||||
local d_p_addp = data[p_addpos]
|
|
||||||
--if py_h >= maxp.y-4 then
|
--if py_h >= maxp.y-4 then
|
||||||
if y <= py_h
|
if y <= py_h
|
||||||
and noisp then
|
and noisp then
|
||||||
if noisp == 1 then
|
if noisp == 1 then
|
||||||
data[p_addpos] = c.netherrack_brick
|
data[vi] = c.netherrack_brick
|
||||||
elseif noisp == 2 then
|
elseif noisp == 2 then
|
||||||
if y == py_h then
|
if y == py_h then
|
||||||
data[p_addpos] = c.netherrack_brick
|
data[vi] = c.netherrack_brick
|
||||||
elseif y == py_h_g
|
elseif y == py_h_g
|
||||||
and pr:next(1,3) <= 2 then
|
and pr:next(1,3) <= 2 then
|
||||||
data[p_addpos] = c.netherrack
|
data[vi] = c.netherrack
|
||||||
elseif y <= py_h_g then
|
elseif y <= py_h_g then
|
||||||
data[p_addpos] = c.lava
|
data[vi] = c.lava
|
||||||
else
|
else
|
||||||
data[p_addpos] = c.air
|
data[vi] = c.air
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
elseif d_p_addp ~= c.air then
|
elseif d_p_addp ~= c.air then
|
||||||
|
|
||||||
if is_forest
|
if is_forest
|
||||||
and y == f_bottom then
|
and y == f_bottom then
|
||||||
data[p_addpos] = c.nether_dirt_top
|
data[vi] = c.nether_dirt_top
|
||||||
elseif is_forest
|
elseif is_forest
|
||||||
and y < f_bottom
|
and y < f_bottom
|
||||||
and y >= f_h_dirt then
|
and y >= f_h_dirt then
|
||||||
data[p_addpos] = c.nether_dirt
|
data[vi] = c.nether_dirt
|
||||||
elseif is_forest
|
elseif is_forest
|
||||||
and y == f_h_dirt-1 then
|
and y == f_h_dirt-1 then
|
||||||
data[p_addpos] = c.nether_dirt_bottom
|
data[vi] = c.nether_dirt_bottom
|
||||||
elseif is_forest
|
elseif is_forest
|
||||||
and y == f_h_dirt+1 then
|
and y == f_h_dirt+1 then
|
||||||
if pr:next(1,tree_rarity) == 1 then
|
if pr:next(1,tree_rarity) == 1 then
|
||||||
trees[num_trees] = {x=x, y=y, z=z}
|
trees[num_trees] = {x=x, y=y, z=z}
|
||||||
num_trees = num_trees+1
|
num_trees = num_trees+1
|
||||||
elseif pr:next(1,mushroom_rarity) == 1 then
|
elseif pr:next(1,mushroom_rarity) == 1 then
|
||||||
data[p_addpos] = c.nether_shroom
|
data[vi] = c.nether_shroom
|
||||||
elseif pr:next(1,glowflower_rarity) == 1 then
|
elseif pr:next(1,glowflower_rarity) == 1 then
|
||||||
data[p_addpos] = c.glowflower
|
data[vi] = c.glowflower
|
||||||
elseif pr:next(1,grass_rarity) == 1 then
|
elseif pr:next(1,grass_rarity) == 1 then
|
||||||
data[p_addpos] = c.nether_grass[pr:next(1,3)]
|
data[vi] = c.nether_grass[pr:next(1,3)]
|
||||||
else
|
else
|
||||||
data[p_addpos] = c.air
|
data[vi] = c.air
|
||||||
end
|
end
|
||||||
elseif is_forest
|
elseif is_forest
|
||||||
and y > f_bottom
|
and y > f_bottom
|
||||||
and y < f_top then
|
and y < f_top then
|
||||||
if not table_contains(
|
if not nether_tree_nodes[d_p_addp] then
|
||||||
{c.nether_tree, c.nether_tree_corner, c.nether_leaves, c.nether_fruit},
|
data[vi] = c.air
|
||||||
d_p_addp
|
|
||||||
) then
|
|
||||||
data[p_addpos] = c.air
|
|
||||||
end
|
end
|
||||||
elseif is_forest
|
elseif is_forest
|
||||||
and y == f_top then
|
and y == f_top then
|
||||||
local sel = math.floor(strassx[x]+strassz[z]+0.5)%10
|
local sel = math.floor(strassx[x]+strassz[z]+0.5)%10
|
||||||
if sel <= 5 then
|
if sel <= 5 then
|
||||||
data[p_addpos] = return_nether_ore(d_p_addp, true)
|
data[vi] = return_nether_ore(d_p_addp, true)
|
||||||
elseif sel == 6 then
|
elseif sel == 6 then
|
||||||
data[p_addpos] = c.netherrack_black
|
data[vi] = c.netherrack_black
|
||||||
elseif sel == 7 then
|
elseif sel == 7 then
|
||||||
data[p_addpos] = c.glowstone
|
data[vi] = c.glowstone
|
||||||
else
|
else
|
||||||
data[p_addpos] = c.air
|
data[vi] = c.air
|
||||||
end
|
end
|
||||||
|
|
||||||
elseif y <= NETHER_BOTTOM then
|
elseif y <= NETHER_BOTTOM then
|
||||||
if y <= bottom then
|
if y <= bottom then
|
||||||
data[p_addpos] = return_nether_ore(d_p_addp, true)
|
data[vi] = return_nether_ore(d_p_addp, true)
|
||||||
else
|
else
|
||||||
data[p_addpos] = c.lava
|
data[vi] = c.lava
|
||||||
end
|
end
|
||||||
elseif r_structure == 1
|
elseif r_structure == 1
|
||||||
and y == bottom then
|
and y == bottom then
|
||||||
@ -578,26 +569,27 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
|||||||
num = num+1
|
num = num+1
|
||||||
elseif y <= bottom then
|
elseif y <= bottom then
|
||||||
if pr:next(1,LAVA_FREQ) == 1 then
|
if pr:next(1,LAVA_FREQ) == 1 then
|
||||||
data[p_addpos] = c.lava
|
data[vi] = c.lava
|
||||||
else
|
else
|
||||||
data[p_addpos] = return_nether_ore(d_p_addp, false)
|
data[vi] = return_nether_ore(d_p_addp, false)
|
||||||
end
|
end
|
||||||
elseif r_shroom == 1
|
elseif r_shroom == 1
|
||||||
and r_structure ~= 1
|
and r_structure ~= 1
|
||||||
and y == bottom+1 then
|
and y == bottom+1 then
|
||||||
data[p_addpos] = c.nether_shroom
|
data[vi] = c.nether_shroom
|
||||||
elseif (y == top and r_glowstone == 1) then
|
elseif (y == top and r_glowstone == 1) then
|
||||||
data[p_addpos] = c.glowstone
|
data[vi] = c.glowstone
|
||||||
elseif y >= top then
|
elseif y >= top then
|
||||||
data[p_addpos] = return_nether_ore(d_p_addp, true)
|
data[vi] = return_nether_ore(d_p_addp, true)
|
||||||
elseif y <= top-1
|
elseif y <= top-1
|
||||||
and generate_vine
|
and generate_vine
|
||||||
and y >= top-r_vine_length then
|
and y >= top-r_vine_length then
|
||||||
data[p_addpos] = c.nether_vine
|
data[vi] = c.nether_vine
|
||||||
else
|
else
|
||||||
data[p_addpos] = c.air
|
data[vi] = c.air
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
vi = vi + area.ystride
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -606,37 +598,42 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
|||||||
-- vm:set_lighting(12)
|
-- vm:set_lighting(12)
|
||||||
-- vm:calc_lighting()
|
-- vm:calc_lighting()
|
||||||
-- vm:update_liquids()
|
-- vm:update_liquids()
|
||||||
vm:write_to_map()
|
vm:write_to_map(false)
|
||||||
|
|
||||||
nether:inform("nodes set", 2, t1)
|
nether:inform("nodes set", 2, t1)
|
||||||
|
|
||||||
local t2 = os.clock()
|
local t2 = minetest.get_us_time()
|
||||||
|
local tr_bl_cnt = 0
|
||||||
|
|
||||||
if structures_enabled then --Trees:
|
if structures_enabled then -- Blood netherstructures
|
||||||
for _,v in ipairs(tab) do
|
tr_bl_cnt = #tab
|
||||||
nether.grow_netherstructure(v, true)
|
for i = 1,tr_bl_cnt do
|
||||||
|
nether.grow_netherstructure(tab[i], true)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if forest_possible then --Trees:
|
if forest_possible then -- Forest trees
|
||||||
for _,v in ipairs(trees) do
|
tr_bl_cnt = tr_bl_cnt + #trees
|
||||||
nether.grow_tree(v, true)
|
for i = 1,#trees do
|
||||||
|
nether.grow_tree(trees[i], true)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
nether:inform("trees set", 2, t2)
|
if tr_bl_cnt > 0 then
|
||||||
|
nether:inform(tr_bl_cnt .. " trees and blood structures set", 2, t2)
|
||||||
|
end
|
||||||
|
|
||||||
t2 = os.clock()
|
t2 = minetest.get_us_time()
|
||||||
fix_light(minp, maxp)
|
minetest.fix_light(minp, maxp)
|
||||||
|
|
||||||
nether:inform("map updated", 2, t2)
|
nether:inform("light fixed", 2, t2)
|
||||||
|
|
||||||
nether:inform("done", 1, t1)
|
nether:inform("done", 1, t1)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
|
||||||
function nether.grow_netherstructure(pos, generated)
|
function nether.grow_netherstructure(pos, generated)
|
||||||
local t1 = os.clock()
|
local t1 = minetest.get_us_time()
|
||||||
|
|
||||||
if not contents_defined then
|
if not contents_defined then
|
||||||
define_contents()
|
define_contents()
|
||||||
@ -653,8 +650,10 @@ function nether.grow_netherstructure(pos, generated)
|
|||||||
local area = r_area(manip, 2, height, pos)
|
local area = r_area(manip, 2, height, pos)
|
||||||
local nodes = manip:get_data()
|
local nodes = manip:get_data()
|
||||||
|
|
||||||
for i = 0, height-1 do
|
local vi = area:indexp(pos)
|
||||||
nodes[area:index(pos.x, pos.y+i, pos.z)] = c.blood_stem
|
for _ = 0, height-1 do
|
||||||
|
nodes[vi] = c.blood_stem
|
||||||
|
vi = vi + area.ystride
|
||||||
end
|
end
|
||||||
|
|
||||||
for i = -1,1 do
|
for i = -1,1 do
|
||||||
@ -693,9 +692,8 @@ function nether.grow_netherstructure(pos, generated)
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
local set = vector.set_data_to_pos
|
local poshash = minetest.hash_node_position
|
||||||
local get = vector.get_data_from_pos
|
local pos_from_hash = minetest.get_position_from_hash
|
||||||
local remove = vector.remove_data_from_pos
|
|
||||||
|
|
||||||
local function soft_node(id)
|
local function soft_node(id)
|
||||||
return id == c.air or id == c.ignore
|
return id == c.air or id == c.ignore
|
||||||
@ -733,7 +731,7 @@ local leaf_thickness = 3 --a bigger number results in more blank trees
|
|||||||
local h_trunk_max = h_max-h_arm_max
|
local h_trunk_max = h_max-h_arm_max
|
||||||
|
|
||||||
function nether.grow_tree(pos, generated)
|
function nether.grow_tree(pos, generated)
|
||||||
local t1 = os.clock()
|
local t1 = minetest.get_us_time()
|
||||||
|
|
||||||
if not contents_defined then
|
if not contents_defined then
|
||||||
define_contents()
|
define_contents()
|
||||||
@ -776,15 +774,17 @@ function nether.grow_tree(pos, generated)
|
|||||||
for j = 1,r do
|
for j = 1,r do
|
||||||
local x = p.x+j*dir[1]
|
local x = p.x+j*dir[1]
|
||||||
local z = p.z+j*dir[2]
|
local z = p.z+j*dir[2]
|
||||||
set(trunks, z,p.y,x, dir[3])
|
trunks[poshash{x=x, y=p.y, z=z}] = dir[3]
|
||||||
end
|
end
|
||||||
r = r+1
|
r = r+1
|
||||||
p.x = p.x+r*dir[1]
|
p.x = p.x+r*dir[1]
|
||||||
p.z = p.z+r*dir[2]
|
p.z = p.z+r*dir[2]
|
||||||
set(trunk_corners, p.z,p.y,p.x, dir[4] or dir[3])
|
trunk_corners[poshash(p)] = dir[4] or dir[3]
|
||||||
local h = math.random(h_arm_min, h_arm_max)
|
local h = math.random(h_arm_min, h_arm_max)
|
||||||
for i = 1,h do
|
for i = 1,h do
|
||||||
set(trunks, p.z,p.y+i,p.x, true)
|
p.y = p.y + i
|
||||||
|
trunks[poshash(p)] = true
|
||||||
|
p.y = p.y - i
|
||||||
end
|
end
|
||||||
p.y = p.y+h
|
p.y = p.y+h
|
||||||
--n = #todo+1 -- caused small trees
|
--n = #todo+1 -- caused small trees
|
||||||
@ -800,10 +800,16 @@ function nether.grow_tree(pos, generated)
|
|||||||
local fruits = {}
|
local fruits = {}
|
||||||
local trunk_ps = {}
|
local trunk_ps = {}
|
||||||
local count = 0
|
local count = 0
|
||||||
local ps, trmin, trmax, trunk_count = vector.get_data_pos_table(trunks)
|
|
||||||
|
|
||||||
update_minmax(min, max, trmin)
|
local ps = {}
|
||||||
update_minmax(min, max, trmax)
|
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
|
||||||
|
|
||||||
for _,d in pairs(ps) do
|
for _,d in pairs(ps) do
|
||||||
if d[4] == true then
|
if d[4] == true then
|
||||||
@ -824,13 +830,14 @@ function nether.grow_tree(pos, generated)
|
|||||||
local x = x+px
|
local x = x+px
|
||||||
local y = y+py
|
local y = y+py
|
||||||
local z = z+pz
|
local z = z+pz
|
||||||
if not get(trunks, z,y,x) then
|
local vi = poshash{x=x, y=y, z=z}
|
||||||
|
if not trunks[vi] then
|
||||||
if fruit_chance
|
if fruit_chance
|
||||||
and math.random(1, fruit_rarity) == 1
|
and math.random(1, fruit_rarity) == 1
|
||||||
and math.random(1, fruit_chance) == 1 then
|
and math.random(1, fruit_chance) == 1 then
|
||||||
set(fruits, z,y,x, true)
|
fruits[vi] = true
|
||||||
else
|
else
|
||||||
set(leaves, z,y,x, true)
|
leaves[vi] = true
|
||||||
end
|
end
|
||||||
update_minmax(min, max, {x=x, z=z})
|
update_minmax(min, max, {x=x, z=z})
|
||||||
end
|
end
|
||||||
@ -841,8 +848,12 @@ function nether.grow_tree(pos, generated)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--ps = nil
|
||||||
|
--collectgarbage()
|
||||||
|
|
||||||
for i = -1,h_stem+1 do
|
for i = -1,h_stem+1 do
|
||||||
trunk_ps[#trunk_ps+1] = {pos.z, pos.y+i, pos.x, 0} -- par 0 because of leaves
|
-- param2 explicitly set 0 due to possibly previous leaves node
|
||||||
|
trunk_ps[#trunk_ps+1] = {pos.z, pos.y+i, pos.x, 0}
|
||||||
end
|
end
|
||||||
|
|
||||||
local manip = minetest.get_voxel_manip()
|
local manip = minetest.get_voxel_manip()
|
||||||
@ -851,8 +862,8 @@ function nether.grow_tree(pos, generated)
|
|||||||
local nodes = manip:get_data()
|
local nodes = manip:get_data()
|
||||||
local param2s = manip:get_param2_data()
|
local param2s = manip:get_param2_data()
|
||||||
|
|
||||||
for _,p in pairs(vector.get_data_pos_table(leaves)) do
|
for i in pairs(leaves) do
|
||||||
p = area:index(p[3], p[2], p[1])
|
local p = area:indexp(pos_from_hash(i))
|
||||||
if soft_node(nodes[p]) then
|
if soft_node(nodes[p]) then
|
||||||
nodes[p] = c.nether_leaves
|
nodes[p] = c.nether_leaves
|
||||||
param2s[p] = math.random(0,179)
|
param2s[p] = math.random(0,179)
|
||||||
@ -860,14 +871,15 @@ function nether.grow_tree(pos, generated)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
for _,p in pairs(vector.get_data_pos_table(fruits)) do
|
for i in pairs(fruits) do
|
||||||
p = area:index(p[3], p[2], p[1])
|
local p = area:indexp(pos_from_hash(i))
|
||||||
if soft_node(nodes[p]) then
|
if soft_node(nodes[p]) then
|
||||||
nodes[p] = c.nether_apple
|
nodes[p] = c.nether_apple
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
for _,p in pairs(trunk_ps) do
|
for i = 1,#trunk_ps do
|
||||||
|
local p = trunk_ps[i]
|
||||||
local par = p[4]
|
local par = p[4]
|
||||||
p = area:index(p[3], p[2], p[1])
|
p = area:index(p[3], p[2], p[1])
|
||||||
if par then
|
if par then
|
||||||
@ -876,25 +888,18 @@ function nether.grow_tree(pos, generated)
|
|||||||
nodes[p] = c.nether_tree
|
nodes[p] = c.nether_tree
|
||||||
end
|
end
|
||||||
|
|
||||||
for _,p in pairs(vector.get_data_pos_table(trunk_corners)) do
|
for i,par2 in pairs(trunk_corners) do
|
||||||
local vi = area:index(p[3], p[2], p[1])
|
local vi = area:indexp(pos_from_hash(i))
|
||||||
nodes[vi] = c.nether_tree_corner
|
nodes[vi] = c.nether_tree_corner
|
||||||
param2s[vi] = p[4]
|
param2s[vi] = par2
|
||||||
end
|
end
|
||||||
|
|
||||||
manip:set_data(nodes)
|
manip:set_data(nodes)
|
||||||
manip:set_param2_data(param2s)
|
manip:set_param2_data(param2s)
|
||||||
manip:write_to_map()
|
manip:write_to_map(not generated)
|
||||||
local spam = 2
|
nether:inform("a nether tree with " .. trunk_count ..
|
||||||
if generated then
|
" branch trunk nodes grew at " .. minetest.pos_to_string(pos),
|
||||||
spam = 3
|
generated and 3 or 2, t1)
|
||||||
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
|
end
|
||||||
|
|
||||||
|
|
||||||
@ -923,7 +928,8 @@ minetest.register_abm({
|
|||||||
action = function(pos)
|
action = function(pos)
|
||||||
if minetest.get_node({x=pos.x, y=pos.y+2, z=pos.z}).name == "air"
|
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
|
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
|
if udata
|
||||||
and udata.groups
|
and udata.groups
|
||||||
and udata.groups.nether_dirt then
|
and udata.groups.nether_dirt then
|
||||||
@ -944,13 +950,15 @@ minetest.register_abm({
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
pos.y = pos.y+1
|
pos.y = pos.y+1
|
||||||
if (minetest.get_node_light(pos) or 16) > 7 then --mushrooms grow at dark places
|
--mushrooms grow at dark places
|
||||||
|
if (minetest.get_node_light(pos) or 16) > 7 then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
if minetest.get_node(pos).name == "air" then
|
if minetest.get_node(pos).name == "air" then
|
||||||
minetest.set_node(pos, {name="riesenpilz:nether_shroom"})
|
minetest.set_node(pos, {name="riesenpilz:nether_shroom"})
|
||||||
pos.y = pos.y-1
|
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
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
@ -964,6 +972,10 @@ local function grass_allowed(pos)
|
|||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
local data = minetest.registered_nodes[nd]
|
local data = minetest.registered_nodes[nd]
|
||||||
|
if not data then
|
||||||
|
-- unknown node
|
||||||
|
return false
|
||||||
|
end
|
||||||
local drawtype = data.drawtype
|
local drawtype = data.drawtype
|
||||||
if drawtype
|
if drawtype
|
||||||
and drawtype ~= "normal"
|
and drawtype ~= "normal"
|
||||||
@ -1010,17 +1022,18 @@ 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.."/crafting.lua")
|
||||||
dofile(path.."/portal.lua")
|
dofile(path.."/portal.lua")
|
||||||
dofile(path.."/guide.lua")
|
dofile(path.."/guide.lua")
|
||||||
|
|
||||||
|
|
||||||
local time = math.floor(tonumber(os.clock()-load_time_start)*100+0.5)/100
|
local time = (minetest.get_us_time() - load_time_start) / 1000000
|
||||||
local msg = "[nether] loaded after ca. "..time
|
local msg = ("[nether] loaded after ca. %g seconds."):format(time)
|
||||||
if time > 0.05 then
|
if time > 0.01 then
|
||||||
minetest.log("warning", msg)
|
print(msg)
|
||||||
else
|
else
|
||||||
minetest.log("info", msg)
|
minetest.log("info", msg)
|
||||||
end
|
end
|
||||||
|
190
nether/items.lua
Executable file → Normal file
@ -4,20 +4,27 @@ local nether_sound = default.node_sound_stone_defaults({
|
|||||||
footstep = {name="nether_footstep", gain=0.4}
|
footstep = {name="nether_footstep", gain=0.4}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
-- The fence registration function from fence_registration
|
||||||
local add_fence = minetest.register_fence
|
local add_fence = minetest.register_fence
|
||||||
|
local stairs_exist = minetest.global_exists("stairs")
|
||||||
|
|
||||||
|
-- A function which registers a fence and stairs nodes for a nether node if the
|
||||||
|
-- mods for these node registrations are available
|
||||||
local function add_more_nodes(name)
|
local function add_more_nodes(name)
|
||||||
local nd = "nether:"..name
|
local nd = "nether:"..name
|
||||||
if not string.find(name, "nether") then
|
if not string.find(name, "nether") then
|
||||||
name = "nether_"..name
|
name = "nether_"..name
|
||||||
end
|
end
|
||||||
local data = minetest.registered_nodes[nd]
|
local data = minetest.registered_nodes[nd]
|
||||||
stairs.register_stair_and_slab(name, nd,
|
if stairs_exist then
|
||||||
data.groups,
|
stairs.register_stair_and_slab(name, nd,
|
||||||
data.tiles,
|
data.groups,
|
||||||
data.description.." Stair",
|
data.tiles,
|
||||||
data.description.." Slab",
|
data.description.." Stair",
|
||||||
data.sounds
|
data.description.." Slab",
|
||||||
)
|
data.sounds
|
||||||
|
)
|
||||||
|
end
|
||||||
if add_fence then
|
if add_fence then
|
||||||
add_fence({fence_of = nd})
|
add_fence({fence_of = nd})
|
||||||
end
|
end
|
||||||
@ -39,7 +46,12 @@ local function digging_allowed(player, v)
|
|||||||
if not player then
|
if not player then
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
local tool = minetest.registered_tools[player:get_wielded_item():get_name()]
|
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]
|
||||||
if not tool
|
if not tool
|
||||||
or not tool.tool_capabilities then
|
or not tool.tool_capabilities then
|
||||||
return false
|
return false
|
||||||
@ -204,7 +216,8 @@ add_more_nodes("blood_empty")
|
|||||||
|
|
||||||
minetest.register_node("nether:blood_top", {
|
minetest.register_node("nether:blood_top", {
|
||||||
description = "Nether Blood Head",
|
description = "Nether Blood Head",
|
||||||
tiles = {"nether_blood_top.png", "nether_blood.png", "nether_blood.png^nether_blood_side.png"},
|
tiles = {"nether_blood_top.png", "nether_blood.png",
|
||||||
|
"nether_blood.png^nether_blood_side.png"},
|
||||||
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=1},
|
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=1},
|
||||||
sounds = default.node_sound_wood_defaults(),
|
sounds = default.node_sound_wood_defaults(),
|
||||||
})
|
})
|
||||||
@ -212,7 +225,8 @@ add_more_nodes("blood_top")
|
|||||||
|
|
||||||
minetest.register_node("nether:blood_top_cooked", {
|
minetest.register_node("nether:blood_top_cooked", {
|
||||||
description = "Cooked Nether Blood Head",
|
description = "Cooked Nether Blood Head",
|
||||||
tiles = {"nether_blood_top_cooked.png", "nether_blood_cooked.png", "nether_blood_cooked.png^nether_blood_side_cooked.png"},
|
tiles = {"nether_blood_top_cooked.png", "nether_blood_cooked.png",
|
||||||
|
"nether_blood_cooked.png^nether_blood_side_cooked.png"},
|
||||||
groups = {nether=3},
|
groups = {nether=3},
|
||||||
sounds = nether_sound,
|
sounds = nether_sound,
|
||||||
furnace_burntime = 10,
|
furnace_burntime = 10,
|
||||||
@ -224,7 +238,8 @@ add_more_nodes("blood_top_cooked")
|
|||||||
|
|
||||||
minetest.register_node("nether:blood_top_empty", {
|
minetest.register_node("nether:blood_top_empty", {
|
||||||
description = "Nether Blood Head Extracted",
|
description = "Nether Blood Head Extracted",
|
||||||
tiles = {"nether_blood_top_empty.png", "nether_blood_empty.png", "nether_blood_empty.png^nether_blood_side_empty.png"},
|
tiles = {"nether_blood_top_empty.png", "nether_blood_empty.png",
|
||||||
|
"nether_blood_empty.png^nether_blood_side_empty.png"},
|
||||||
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=1},
|
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=1},
|
||||||
sounds = default.node_sound_wood_defaults(),
|
sounds = default.node_sound_wood_defaults(),
|
||||||
})
|
})
|
||||||
@ -233,7 +248,8 @@ add_more_nodes("blood_top_empty")
|
|||||||
|
|
||||||
minetest.register_node("nether:blood_stem", {
|
minetest.register_node("nether:blood_stem", {
|
||||||
description = "Nether Blood Stem",
|
description = "Nether Blood Stem",
|
||||||
tiles = {"nether_blood_stem_top.png", "nether_blood_stem_top.png", "nether_blood_stem.png"},
|
tiles = {"nether_blood_stem_top.png", "nether_blood_stem_top.png",
|
||||||
|
"nether_blood_stem.png"},
|
||||||
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=1},
|
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=1},
|
||||||
sounds = default.node_sound_wood_defaults(),
|
sounds = default.node_sound_wood_defaults(),
|
||||||
})
|
})
|
||||||
@ -241,7 +257,8 @@ add_more_nodes("blood_stem")
|
|||||||
|
|
||||||
minetest.register_node("nether:blood_stem_cooked", {
|
minetest.register_node("nether:blood_stem_cooked", {
|
||||||
description = "Cooked Nether Blood Stem",
|
description = "Cooked Nether Blood Stem",
|
||||||
tiles = {"nether_blood_stem_top_cooked.png", "nether_blood_stem_top_cooked.png", "nether_blood_stem_cooked.png"},
|
tiles = {"nether_blood_stem_top_cooked.png",
|
||||||
|
"nether_blood_stem_top_cooked.png", "nether_blood_stem_cooked.png"},
|
||||||
groups = {nether=3},
|
groups = {nether=3},
|
||||||
sounds = nether_sound,
|
sounds = nether_sound,
|
||||||
furnace_burntime = 30,
|
furnace_burntime = 30,
|
||||||
@ -253,7 +270,8 @@ add_more_nodes("blood_stem_cooked")
|
|||||||
|
|
||||||
minetest.register_node("nether:blood_stem_empty", {
|
minetest.register_node("nether:blood_stem_empty", {
|
||||||
description = "Nether Blood Stem Extracted",
|
description = "Nether Blood Stem Extracted",
|
||||||
tiles = {"nether_blood_stem_top_empty.png", "nether_blood_stem_top_empty.png", "nether_blood_stem_empty.png"},
|
tiles = {"nether_blood_stem_top_empty.png",
|
||||||
|
"nether_blood_stem_top_empty.png", "nether_blood_stem_empty.png"},
|
||||||
groups = {tree=1, choppy=2, oddly_breakable_by_hand=1},
|
groups = {tree=1, choppy=2, oddly_breakable_by_hand=1},
|
||||||
sounds = default.node_sound_wood_defaults(),
|
sounds = default.node_sound_wood_defaults(),
|
||||||
})
|
})
|
||||||
@ -345,7 +363,10 @@ minetest.override_item("riesenpilz:nether_shroom", {
|
|||||||
minetest.register_node("nether:apple", {
|
minetest.register_node("nether:apple", {
|
||||||
description = "Nether Fruit",
|
description = "Nether Fruit",
|
||||||
drawtype = "nodebox",
|
drawtype = "nodebox",
|
||||||
tiles = {"nether_fruit_top.png", "nether_fruit_bottom.png", "nether_fruit.png", "nether_fruit.png^[transformFX", "nether_fruit.png^[transformFX", "nether_fruit.png"},
|
tiles = {"nether_fruit_top.png", "nether_fruit_bottom.png",
|
||||||
|
"nether_fruit.png", "nether_fruit.png^[transformFX",
|
||||||
|
"nether_fruit.png^[transformFX", "nether_fruit.png"},
|
||||||
|
use_texture_alpha = "opaque",
|
||||||
node_box = {
|
node_box = {
|
||||||
type = "fixed",
|
type = "fixed",
|
||||||
fixed = {
|
fixed = {
|
||||||
@ -373,21 +394,9 @@ minetest.register_node("nether:apple", {
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
itemstack:take_item()
|
itemstack:take_item()
|
||||||
if nether_port(user, vector.round(user:getpos())) then
|
if nether.teleport_player(user) then
|
||||||
return itemstack
|
return itemstack
|
||||||
end
|
end
|
||||||
|
|
||||||
local 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)
|
local amount = math.random(4, 6)
|
||||||
inv:add_item("main", {name="nether:blood_extracted", count=math.floor(amount/3)})
|
inv:add_item("main", {name="nether:blood_extracted", count=math.floor(amount/3)})
|
||||||
user:set_hp(user:get_hp()-amount)
|
user:set_hp(user:get_hp()-amount)
|
||||||
@ -512,8 +521,10 @@ minetest.register_node("nether:tree", {
|
|||||||
|
|
||||||
minetest.register_node("nether:tree_corner", {
|
minetest.register_node("nether:tree_corner", {
|
||||||
description = "Nether Trunk Corner",
|
description = "Nether Trunk Corner",
|
||||||
tiles = {"nether_tree.png^[transformR180", "nether_tree_top.png", "nether_tree_corner.png^[transformFY",
|
tiles = {"nether_tree.png^[transformR180", "nether_tree_top.png",
|
||||||
"nether_tree_corner.png^[transformR180", "nether_tree.png", "nether_tree_top.png"},
|
"nether_tree_corner.png^[transformFY",
|
||||||
|
"nether_tree_corner.png^[transformR180", "nether_tree.png",
|
||||||
|
"nether_tree_top.png"},
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
is_ground_content = false,
|
is_ground_content = false,
|
||||||
groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,not_in_creative_inventory=1},
|
groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,not_in_creative_inventory=1},
|
||||||
@ -534,7 +545,7 @@ minetest.register_node("nether:leaves", {
|
|||||||
description = "Nether Leaves",
|
description = "Nether Leaves",
|
||||||
drawtype = "plantlike",
|
drawtype = "plantlike",
|
||||||
waving = 1,
|
waving = 1,
|
||||||
visual_scale = math.sqrt(math.sqrt(2)),
|
visual_scale = math.sqrt(2) + 0.01,
|
||||||
tiles = {"nether_leaves.png"},
|
tiles = {"nether_leaves.png"},
|
||||||
inventory_image = "nether_leaves.png",
|
inventory_image = "nether_leaves.png",
|
||||||
wield_image = "nether_leaves.png",
|
wield_image = "nether_leaves.png",
|
||||||
@ -635,7 +646,7 @@ minetest.register_node("nether:portal", {
|
|||||||
light_source = 12,
|
light_source = 12,
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
sunlight_propagates = true,
|
sunlight_propagates = true,
|
||||||
use_texture_alpha = true,
|
use_texture_alpha = "blend",
|
||||||
walkable = false,
|
walkable = false,
|
||||||
pointable = false,
|
pointable = false,
|
||||||
buildable_to = false,
|
buildable_to = false,
|
||||||
@ -825,53 +836,51 @@ minetest.register_craftitem("nether:hotbed", {
|
|||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
-- Modif MFF the entire tool
|
|
||||||
minetest.register_tool("nether:pick_mushroom", {
|
minetest.register_tool("nether:pick_mushroom", {
|
||||||
description = "Nether Mushroom Pickaxe",
|
description = "Nether Mushroom Pickaxe",
|
||||||
inventory_image = "nether_pick_mushroom.png",
|
inventory_image = "nether_pick_mushroom.png",
|
||||||
tool_capabilities = {
|
tool_capabilities = {
|
||||||
max_drop_level=0,
|
max_drop_level=0,
|
||||||
groupcaps={
|
groupcaps={
|
||||||
cracky = {times={[3]=3.0}, uses=5, maxlevel=1},
|
cracky = {times={[3]=3}, uses=1, maxlevel=1},
|
||||||
nether = {times={[3]=3}, uses=5, maxlevel=1},
|
nether = {times={[3]=3}, uses=1, maxlevel=1},
|
||||||
},
|
},
|
||||||
damage_groups = {fleshy=2},
|
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_tool("nether:pick_wood", { -- Modif MFF the entire tool
|
minetest.register_tool("nether:pick_wood", {
|
||||||
description = "Nether Wood Pickaxe",
|
description = "Nether Wood Pickaxe",
|
||||||
inventory_image = "nether_pick_wood.png",
|
inventory_image = "nether_pick_wood.png",
|
||||||
tool_capabilities = {
|
tool_capabilities = {
|
||||||
full_punch_interval = 1.2,
|
full_punch_interval = 1.2,
|
||||||
max_drop_level=0,
|
max_drop_level=0,
|
||||||
groupcaps={
|
groupcaps={
|
||||||
cracky = {times={[3]=1.60}, uses=10, maxlevel=1},
|
cracky = {times={[3]=1.6}, uses=10, maxlevel=1},
|
||||||
nether = {times={[2]=6, [3]=1.60}, uses=10, maxlevel=1},
|
nether = {times={[2]=6, [3]=1.6}, uses=10, maxlevel=1},
|
||||||
},
|
},
|
||||||
damage_groups = {fleshy=2},
|
damage_groups = {fleshy=2},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_tool("nether:pick_netherrack", { -- Modif MFF the entire tool
|
minetest.register_tool("nether:pick_netherrack", {
|
||||||
description = "Netherrack Pickaxe",
|
description = "Netherrack Pickaxe",
|
||||||
inventory_image = "nether_pick_netherrack.png",
|
inventory_image = "nether_pick_netherrack.png",
|
||||||
tool_capabilities = {
|
tool_capabilities = {
|
||||||
full_punch_interval = 1.2,
|
full_punch_interval = 1.3,
|
||||||
max_drop_level=0,
|
max_drop_level=0,
|
||||||
groupcaps={
|
groupcaps={
|
||||||
cracky = {times={[2]=2.00, [3]=1.20}, uses=20, maxlevel=2},
|
cracky = {times={[2]=2.0, [3]=1.20}, uses=20, maxlevel=1},
|
||||||
nether = {times={[1]=16, [2]=2.00, [3]=1.20}, uses=20, maxlevel=1},
|
nether = {times={[1]=16, [2]=2, [3]=1.20}, uses=20, maxlevel=1},
|
||||||
},
|
},
|
||||||
damage_groups = {fleshy=3},
|
damage_groups = {fleshy=3},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_tool("nether:pick_netherrack_blue", { -- Modif MFF the entire tool
|
minetest.register_tool("nether:pick_netherrack_blue", {
|
||||||
description = "Blue Netherrack Pickaxe",
|
description = "Blue Netherrack Pickaxe",
|
||||||
inventory_image = "nether_pick_netherrack_blue.png",
|
inventory_image = "nether_pick_netherrack_blue.png",
|
||||||
tool_capabilities = {
|
tool_capabilities = {
|
||||||
full_punch_interval = 0.8,
|
full_punch_interval = 1.0,
|
||||||
max_drop_level=1,
|
max_drop_level=1,
|
||||||
groupcaps={
|
groupcaps={
|
||||||
cracky = {times={[1]=4.00, [2]=1.60, [3]=0.80}, uses=30, maxlevel=2},
|
cracky = {times={[1]=4.00, [2]=1.60, [3]=0.80}, uses=30, maxlevel=2},
|
||||||
@ -881,62 +890,60 @@ minetest.register_tool("nether:pick_netherrack_blue", { -- Modif MFF the entire
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_tool("nether:pick_white", { -- Modif MFF the entire tool
|
minetest.register_tool("nether:pick_white", {
|
||||||
description = "Siwtonic Pickaxe",
|
description = "Siwtonic Pickaxe",
|
||||||
inventory_image = "nether_pick_white.png",
|
inventory_image = "nether_pick_white.png",
|
||||||
tool_capabilities = {
|
tool_capabilities = {
|
||||||
full_punch_interval = 0.5,
|
full_punch_interval = 0.9,
|
||||||
max_drop_level=3,
|
max_drop_level=3,
|
||||||
groupcaps={
|
groupcaps={
|
||||||
cracky = {times={[1]=1.75, [2]=0.85, [3]=0.40}, uses=125, maxlevel=3},
|
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=125, maxlevel=3},
|
nether = {times={[1]=1, [2]=0.5, [3]=0.3}, uses=180, maxlevel=3},
|
||||||
},
|
},
|
||||||
damage_groups = {fleshy=5},
|
damage_groups = {fleshy=5},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Nether Axe
|
minetest.register_tool("nether:axe_netherrack", {
|
||||||
minetest.register_tool("nether:axe_netherrack", { -- Modif MFF the entire tool
|
|
||||||
description = "Netherrack Axe",
|
description = "Netherrack Axe",
|
||||||
inventory_image = "nether_axe_netherrack.png",
|
inventory_image = "nether_axe_netherrack.png",
|
||||||
tool_capabilities = {
|
tool_capabilities = {
|
||||||
full_punch_interval = 1.3,
|
full_punch_interval = 1.3,
|
||||||
max_drop_level=0,
|
max_drop_level=0,
|
||||||
groupcaps={
|
groupcaps={
|
||||||
choppy={times={[1]=3.00, [2]=1.00, [3]=0.60}, uses=20, maxlevel=2},
|
choppy={times={[1]=2.9, [2]=1.9, [3]=1.4}, uses=20, maxlevel=1},
|
||||||
},
|
},
|
||||||
damage_groups = {fleshy=3},
|
damage_groups = {fleshy=4},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_tool("nether:axe_netherrack_blue", { -- Modif MFF the entire tool
|
minetest.register_tool("nether:axe_netherrack_blue", {
|
||||||
description = "Blue Netherrack Axe",
|
description = "Blue Netherrack Axe",
|
||||||
inventory_image = "nether_axe_netherrack_blue.png",
|
inventory_image = "nether_axe_netherrack_blue.png",
|
||||||
tool_capabilities = {
|
tool_capabilities = {
|
||||||
full_punch_interval = 0.9,
|
full_punch_interval = 0.9,
|
||||||
max_drop_level=1,
|
max_drop_level=1,
|
||||||
groupcaps={
|
groupcaps={
|
||||||
choppy={times={[1]=2.00, [2]=0.80, [3]=0.40}, uses=30, maxlevel=2},
|
choppy={times={[1]=2.5, [2]=1.5, [3]=1}, uses=30, maxlevel=2},
|
||||||
},
|
},
|
||||||
damage_groups = {fleshy=4},
|
damage_groups = {fleshy=6},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_tool("nether:axe_white", { -- Modif MFF the entire tool
|
minetest.register_tool("nether:axe_white", {
|
||||||
description = "Siwtonic Axe",
|
description = "Siwtonic Axe",
|
||||||
inventory_image = "nether_axe_white.png",
|
inventory_image = "nether_axe_white.png",
|
||||||
tool_capabilities = {
|
tool_capabilities = {
|
||||||
full_punch_interval = 0.9,
|
full_punch_interval = 0.9,
|
||||||
max_drop_level=1,
|
max_drop_level=1,
|
||||||
groupcaps={
|
groupcaps={
|
||||||
choppy={times={[1]=0.90, [2]=0.45, [3]=0.20}, uses=125, maxlevel=3},
|
choppy={times={[1]=1.2, [2]=0.5, [3]=0.3}, uses=180, maxlevel=2},
|
||||||
},
|
},
|
||||||
damage_groups = {fleshy=5},
|
damage_groups = {fleshy=8},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Nether Shovel
|
minetest.register_tool("nether:shovel_netherrack", {
|
||||||
minetest.register_tool("nether:shovel_netherrack", { -- Modif MFF the entire tool
|
|
||||||
description = "Netherrack Shovel",
|
description = "Netherrack Shovel",
|
||||||
inventory_image = "nether_shovel_netherrack.png",
|
inventory_image = "nether_shovel_netherrack.png",
|
||||||
wield_image = "nether_shovel_netherrack.png^[transformR90",
|
wield_image = "nether_shovel_netherrack.png^[transformR90",
|
||||||
@ -944,13 +951,13 @@ minetest.register_tool("nether:shovel_netherrack", { -- Modif MFF the entire to
|
|||||||
full_punch_interval = 1.4,
|
full_punch_interval = 1.4,
|
||||||
max_drop_level=0,
|
max_drop_level=0,
|
||||||
groupcaps={
|
groupcaps={
|
||||||
crumbly = {times={[1]=3.30, [2]=2.20, [3]=1.32}, uses=20, maxlevel=2},
|
crumbly = {times={[1]=1.7, [2]=1.1, [3]=0.45}, uses=22, maxlevel=2},
|
||||||
},
|
},
|
||||||
damage_groups = {fleshy=3},
|
damage_groups = {fleshy=2},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_tool("nether:shovel_netherrack_blue", { -- Modif MFF the entire tool
|
minetest.register_tool("nether:shovel_netherrack_blue", {
|
||||||
description = "Blue Netherrack Shovel",
|
description = "Blue Netherrack Shovel",
|
||||||
inventory_image = "nether_shovel_netherrack_blue.png",
|
inventory_image = "nether_shovel_netherrack_blue.png",
|
||||||
wield_image = "nether_shovel_netherrack_blue.png^[transformR90",
|
wield_image = "nether_shovel_netherrack_blue.png^[transformR90",
|
||||||
@ -958,13 +965,13 @@ minetest.register_tool("nether:shovel_netherrack_blue", { -- Modif MFF the entir
|
|||||||
full_punch_interval = 1.1,
|
full_punch_interval = 1.1,
|
||||||
max_drop_level=1,
|
max_drop_level=1,
|
||||||
groupcaps={
|
groupcaps={
|
||||||
crumbly = {times={[1]=4.40, [2]=1.76, [3]=0.88}, uses=30, maxlevel=2},
|
crumbly = {times={[1]=1.4, [2]=0.8, [3]=0.35}, uses=50, maxlevel=2},
|
||||||
},
|
},
|
||||||
damage_groups = {fleshy=4},
|
damage_groups = {fleshy=3},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_tool("nether:shovel_white", { -- Modif MFF the entire tool
|
minetest.register_tool("nether:shovel_white", {
|
||||||
description = "Siwtonic Shovel",
|
description = "Siwtonic Shovel",
|
||||||
inventory_image = "nether_shovel_white.png",
|
inventory_image = "nether_shovel_white.png",
|
||||||
wield_image = "nether_shovel_white.png^[transformR90",
|
wield_image = "nether_shovel_white.png^[transformR90",
|
||||||
@ -972,49 +979,56 @@ minetest.register_tool("nether:shovel_white", { -- Modif MFF the entire tool
|
|||||||
full_punch_interval = 1,
|
full_punch_interval = 1,
|
||||||
max_drop_level=1,
|
max_drop_level=1,
|
||||||
groupcaps={
|
groupcaps={
|
||||||
crumbly = {times={[1]=1.93, [2]=0.94, [3]=0.44}, uses=125, maxlevel=3},
|
crumbly = {times={[1]=0.95, [2]=0.45, [3]=0.1}, uses=151, maxlevel=3},
|
||||||
},
|
|
||||||
damage_groups = {fleshy=5},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
-- 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.9,
|
|
||||||
max_drop_level=0,
|
|
||||||
groupcaps={
|
|
||||||
snappy={times={[2]=1.3, [3]=0.38}, uses=40, maxlevel=1},
|
|
||||||
},
|
},
|
||||||
damage_groups = {fleshy=4},
|
damage_groups = {fleshy=4},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_tool("nether:sword_netherrack_blue", { -- Modif MFF the entire tool
|
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},
|
||||||
|
},
|
||||||
|
damage_groups = {fleshy=5},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_tool("nether:sword_netherrack_blue", {
|
||||||
description = "Blue Netherrack Sword",
|
description = "Blue Netherrack Sword",
|
||||||
inventory_image = "nether_sword_netherrack_blue.png",
|
inventory_image = "nether_sword_netherrack_blue.png",
|
||||||
tool_capabilities = {
|
tool_capabilities = {
|
||||||
full_punch_interval = 0.7,
|
full_punch_interval = 0.8,
|
||||||
max_drop_level=1,
|
max_drop_level=1,
|
||||||
groupcaps={
|
groupcaps={
|
||||||
snappy={times={[1]=2.5, [2]=1.1, [3]=0.33}, uses=40, maxlevel=2},
|
snappy={times={[1]=2.5, [2]=1.1, [3]=0.33}, uses=40, maxlevel=2},
|
||||||
},
|
},
|
||||||
damage_groups = {fleshy=6},
|
damage_groups = {fleshy=7},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_tool("nether:sword_white", { -- Modif MFF the entire tool
|
minetest.register_tool("nether:sword_white", {
|
||||||
description = "Siwtonic Sword",
|
description = "Siwtonic Sword",
|
||||||
inventory_image = "nether_sword_white.png",
|
inventory_image = "nether_sword_white.png",
|
||||||
wield_image = "nether_sword_white.png^[transformR90",
|
wield_image = "nether_sword_white.png^[transformR90",
|
||||||
tool_capabilities = {
|
tool_capabilities = {
|
||||||
full_punch_interval = 0.6,
|
full_punch_interval = 0.7,
|
||||||
max_drop_level=1,
|
max_drop_level=1,
|
||||||
groupcaps={
|
groupcaps={
|
||||||
snappy={times={[1]=1.7, [2]=0.8, [3]=0.2}, uses=100, maxlevel=3},
|
snappy={times={[1]=1.7, [2]=0.8, [3]=0.2}, uses=100, maxlevel=3},
|
||||||
},
|
},
|
||||||
damage_groups = {fleshy=8},
|
damage_groups = {fleshy=11},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
-- 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
|
||||||
|
3
nether/mod.conf
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
name = nether
|
||||||
|
depends = default,glow,riesenpilz
|
||||||
|
optional_depends = creative,fence_registration,function_delayer,stairs,watershed
|
26
nether/pearl.lua
Executable file → Normal file
@ -1,22 +1,14 @@
|
|||||||
local function table_contains(t, v)
|
|
||||||
for _,i in pairs(t) do
|
|
||||||
if v == i then
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
|
|
||||||
local creative = minetest.setting_getbool("creative_mode")
|
|
||||||
local function throw_pearl(item, player)
|
local function throw_pearl(item, player)
|
||||||
local playerpos = player:getpos()
|
local playerpos = player:get_pos()
|
||||||
playerpos.y = playerpos.y+1.625
|
playerpos.y = playerpos.y+1.625
|
||||||
local obj = minetest.add_entity(playerpos, "nether:pearl_entity")
|
local obj = minetest.add_entity(playerpos, "nether:pearl_entity")
|
||||||
local dir = player:get_look_dir()
|
local dir = player:get_look_dir()
|
||||||
obj:setvelocity(vector.multiply(dir, 30))
|
obj:set_velocity(vector.multiply(dir, 30))
|
||||||
obj:setacceleration({x=dir.x*-3, y=-dir.y^8*80-10, z=dir.z*-3})
|
obj:set_acceleration({x=dir.x*-3, y=-dir.y^8*80-10, z=dir.z*-3})
|
||||||
obj:get_luaentity().player = player:get_player_name()
|
local pname = player:get_player_name()
|
||||||
if not creative then
|
obj:get_luaentity().player = pname
|
||||||
|
if not minetest.is_creative_enabled(pname) then
|
||||||
item:take_item()
|
item:take_item()
|
||||||
return item
|
return item
|
||||||
end
|
end
|
||||||
@ -64,7 +56,7 @@ local function teleport_player(pos, player)
|
|||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
pos.y = pos.y+0.05
|
pos.y = pos.y+0.05
|
||||||
player:moveto(pos)
|
player:move_to(pos)
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -107,7 +99,7 @@ minetest.register_entity("nether:pearl_entity", {
|
|||||||
self.player = tmp.player
|
self.player = tmp.player
|
||||||
end,
|
end,
|
||||||
get_staticdata = function(self)
|
get_staticdata = function(self)
|
||||||
--forceload(vector.round(self.object:getpos()))
|
--forceload(vector.round(self.object:get_pos()))
|
||||||
return minetest.serialize({
|
return minetest.serialize({
|
||||||
player = self.player,
|
player = self.player,
|
||||||
})
|
})
|
||||||
@ -129,7 +121,7 @@ minetest.register_entity("nether:pearl_entity", {
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local pos = self.object:getpos()
|
local pos = self.object:get_pos()
|
||||||
local rpos = vector.round(pos)
|
local rpos = vector.round(pos)
|
||||||
local lastpos = self.lastpos
|
local lastpos = self.lastpos
|
||||||
if not lastpos then
|
if not lastpos then
|
||||||
|
409
nether/portal.lua
Executable file → Normal file
@ -2,8 +2,7 @@
|
|||||||
|
|
||||||
-- kills the player if he uses PilzAdam portal
|
-- kills the player if he uses PilzAdam portal
|
||||||
local portal_target = nether.buildings+1
|
local portal_target = nether.buildings+1
|
||||||
local nether_prisons = minetest.setting_getbool("enable_damage")
|
local damage_enabled = minetest.settings:get_bool"enable_damage"
|
||||||
local obsidian_portal_kills = nether_prisons and true
|
|
||||||
local mclike_portal = false
|
local mclike_portal = false
|
||||||
|
|
||||||
local abm_allowed
|
local abm_allowed
|
||||||
@ -11,43 +10,39 @@ minetest.after(5, function()
|
|||||||
abm_allowed = true
|
abm_allowed = true
|
||||||
end)
|
end)
|
||||||
|
|
||||||
nether.spawn_point = minetest.string_to_pos(minetest.setting_get("nether_static_spawnpoint") or "")
|
local save_path = minetest.get_worldpath() .. "/nether_players"
|
||||||
-- If nil then we use random spawn points
|
local players_in_nether = {}
|
||||||
|
|
||||||
table.icontains = table.icontains or function(t, v)
|
-- Load the list of players which are trapped in the nether
|
||||||
for _,i in ipairs(t) do
|
-- (or would be trapped if nether.trap_players was true)
|
||||||
if i == v then
|
do
|
||||||
return true
|
local file = io.open(save_path, "r")
|
||||||
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
|
if file then
|
||||||
local contents = file:read('*all')
|
local contents = file:read"*all"
|
||||||
io.close(file)
|
io.close(file)
|
||||||
if contents then
|
if contents then
|
||||||
nether.players_in_nether = string.split(contents, " ")
|
local playernames = string.split(contents, " ")
|
||||||
|
for i = 1,#playernames do
|
||||||
|
players_in_nether[playernames[i]] = true
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function save_nether_players()
|
local function save_nether_players()
|
||||||
local output = ''
|
local playernames,n = {},1
|
||||||
for _,name in ipairs(nether.players_in_nether) do
|
for name in pairs(players_in_nether) do
|
||||||
output = output..name..' '
|
playernames[n] = name
|
||||||
|
n = n+1
|
||||||
end
|
end
|
||||||
local f = io.open(minetest.get_worldpath()..'/nether_players', "w")
|
local f = io.open(save_path, "w")
|
||||||
f:write(output)
|
assert(f, "Could not open nether_players file for writing.")
|
||||||
|
f:write(table.concat(playernames, " "))
|
||||||
io.close(f)
|
io.close(f)
|
||||||
end
|
end
|
||||||
|
|
||||||
local update_background
|
local update_background
|
||||||
--if nether_prisons then
|
if nether.trap_players then
|
||||||
function update_background(player, down)
|
function update_background(player, down)
|
||||||
if down then
|
if down then
|
||||||
player:set_sky({r=15, g=0, b=0}, "plain")
|
player:set_sky({r=15, g=0, b=0}, "plain")
|
||||||
@ -55,107 +50,96 @@ local update_background
|
|||||||
player:set_sky(nil, "regular")
|
player:set_sky(nil, "regular")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
--else
|
else
|
||||||
-- function update_background()end
|
function update_background()end
|
||||||
--end
|
end
|
||||||
|
|
||||||
-- returns nodename if area is generated, else calls generation function
|
-- returns nodename if area is generated, else calls generation function
|
||||||
local function generated_or_generate(pos)
|
local function generated_or_generate(pos)
|
||||||
local name = minetest.get_node(pos).name
|
local node = minetest.get_node_or_nil(pos)
|
||||||
if name ~= "ignore" then
|
if node then
|
||||||
return name
|
return node.name
|
||||||
end
|
end
|
||||||
minetest.get_voxel_manip():read_from_map(pos, pos)
|
minetest.get_voxel_manip():read_from_map(pos, pos)
|
||||||
name = minetest.get_node_or_nil(pos)
|
node = minetest.get_node_or_nil(pos)
|
||||||
if not name then
|
if not node then
|
||||||
minetest.emerge_area(vector.subtract(pos, 80), vector.add(pos, 80))
|
minetest.emerge_area(vector.subtract(pos, 80), vector.add(pos, 80))
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
return name.name
|
return node.name
|
||||||
end
|
end
|
||||||
|
|
||||||
-- where the player appears after dying
|
-- where the player appears after dying
|
||||||
local function get_player_died_target(player)
|
local function get_player_died_target(player)
|
||||||
local target = vector.add(player:getpos(), {x=math.random(-100,100), y=0, z=math.random(-100,100)})
|
local target = vector.add(player:get_pos(),
|
||||||
|
{x=math.random(-100,100), y=0, z=math.random(-100,100)})
|
||||||
target.y = portal_target + math.random(4)
|
target.y = portal_target + math.random(4)
|
||||||
return target
|
return target
|
||||||
end
|
end
|
||||||
nether.get_player_died_target = get_player_died_target
|
|
||||||
|
|
||||||
-- used for obsidian portal
|
-- used for obsidian portal
|
||||||
local function obsidian_teleport(player, pname)
|
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.")
|
minetest.chat_send_player(pname, "For any reason you arrived here. Type " ..
|
||||||
if obsidian_portal_kills then
|
"/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
|
||||||
player:set_hp(0)
|
player:set_hp(0)
|
||||||
return true
|
|
||||||
end
|
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
|
end
|
||||||
|
|
||||||
-- teleports players to nether or helps it
|
-- teleports players to nether or helps it
|
||||||
function nether.player_to_nether(player, safe)
|
local function player_to_nether(player, pos)
|
||||||
local pname = player:get_player_name()
|
local pname = player:get_player_name()
|
||||||
if table.icontains(nether.players_in_nether, pname) then
|
players_in_nether[pname] = true
|
||||||
|
save_nether_players()
|
||||||
|
update_background(player, true)
|
||||||
|
if pos then
|
||||||
|
player:set_pos(pos)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
nether.players_in_nether[#nether.players_in_nether+1] = pname
|
minetest.chat_send_player(pname, "For any reason you arrived here. " ..
|
||||||
save_nether_players()
|
"Type /nether_help to find out things like craft recipes.")
|
||||||
if not safe then
|
if nether.trap_players 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)
|
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
|
end
|
||||||
update_background(player, true)
|
if not damage_enabled or not nether.trap_players then
|
||||||
|
player:set_pos(get_player_died_target(player))
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function nether.player_from_nether(player)
|
local function player_from_nether(player, pos)
|
||||||
local pname = player:get_player_name()
|
local pname = player:get_player_name()
|
||||||
local changes
|
if players_in_nether[pname] then
|
||||||
for n,i in ipairs(nether.players_in_nether) do
|
players_in_nether[pname] = nil
|
||||||
if i == pname then
|
|
||||||
table.remove(nether.players_in_nether, n)
|
|
||||||
changes = true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if changes then
|
|
||||||
save_nether_players()
|
save_nether_players()
|
||||||
end
|
end
|
||||||
update_background(player)
|
update_background(player, false)
|
||||||
|
player:set_pos(pos)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
local function player_exists(name)
|
local function player_exists(name)
|
||||||
for _,player in pairs(minetest.get_connected_players()) do
|
local players = minetest.get_connected_players()
|
||||||
if player:get_player_name() == name then
|
for i = 1,#players do
|
||||||
|
if players[i]:get_player_name() == name then
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Chatcommands (edited) written by sss
|
||||||
-- Chatcommands removed
|
|
||||||
--[[ Chatcommands (edited) written by sss
|
|
||||||
minetest.register_chatcommand("to_hell", {
|
minetest.register_chatcommand("to_hell", {
|
||||||
params = "[<player_name>]",
|
params = "[<player_name>]",
|
||||||
description = "Send someone to hell",
|
description = "Send someone to hell",
|
||||||
func = function(name, pname)
|
func = function(name, pname)
|
||||||
if not minetest.check_player_privs(name, {nether=true}) then
|
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 privilege to execute this chatcommand."
|
||||||
end
|
end
|
||||||
if not player_exists(pname) then
|
if not player_exists(pname) then
|
||||||
pname = name
|
pname = name
|
||||||
@ -175,7 +159,8 @@ minetest.register_chatcommand("from_hell", {
|
|||||||
description = "Extract from hell",
|
description = "Extract from hell",
|
||||||
func = function(name, pname)
|
func = function(name, pname)
|
||||||
if not minetest.check_player_privs(name, {nether=true}) then
|
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
|
end
|
||||||
if not player_exists(pname) then
|
if not player_exists(pname) then
|
||||||
pname = name
|
pname = name
|
||||||
@ -185,99 +170,100 @@ minetest.register_chatcommand("from_hell", {
|
|||||||
return false, "Something went wrong."
|
return false, "Something went wrong."
|
||||||
end
|
end
|
||||||
minetest.chat_send_player(pname, "You are free now")
|
minetest.chat_send_player(pname, "You are free now")
|
||||||
player_from_nether(player)
|
local pos = player:get_pos()
|
||||||
local pos = player:getpos()
|
player_from_nether(player, {x=pos.x, y=100, z=pos.z})
|
||||||
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."
|
return true, pname.." is now out of the nether."
|
||||||
end
|
end
|
||||||
})]]
|
})
|
||||||
|
|
||||||
|
|
||||||
if nether_prisons then
|
-- Disallow teleportation and change spawn positions if the nether traps players
|
||||||
|
if nether.trap_players then
|
||||||
-- randomly set player position when he/she dies in nether
|
-- randomly set player position when he/she dies in nether
|
||||||
minetest.register_on_respawnplayer(function(player)
|
minetest.register_on_respawnplayer(function(player)
|
||||||
local pname = player:get_player_name()
|
local pname = player:get_player_name()
|
||||||
if not table.icontains(nether.players_in_nether, pname) then
|
if not players_in_nether[pname] then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
local target
|
local target = get_player_died_target(player)
|
||||||
if nether.spawn_point then
|
player:set_pos(target)
|
||||||
target = nether.spawn_point
|
|
||||||
else
|
|
||||||
target = get_player_died_target(player)
|
|
||||||
end
|
|
||||||
player:moveto(target)
|
|
||||||
minetest.after(0, function(pname, target)
|
minetest.after(0, function(pname, target)
|
||||||
-- fixes respawn bug
|
-- fixes respawn bug
|
||||||
local player = minetest.get_player_by_name(pname)
|
local player = minetest.get_player_by_name(pname)
|
||||||
if player then
|
if player then
|
||||||
player:moveto(target)
|
player:move_to(target)
|
||||||
end
|
end
|
||||||
end, pname, target)
|
end, pname, target)
|
||||||
return true
|
return true
|
||||||
end)
|
end)
|
||||||
|
|
||||||
-- function for teleporting players where they belong to
|
-- override set_pos etc. to disallow player teleportion by e.g. travelnet
|
||||||
local function update_players()
|
local function can_teleport(player, pos)
|
||||||
for _,player in pairs(minetest.get_connected_players()) do
|
if not player:is_player() then
|
||||||
local pname = player:get_player_name()
|
-- the same metatable is used for entities
|
||||||
local ppos = player:getpos()
|
return true
|
||||||
if table.icontains(nether.players_in_nether, pname) then
|
end
|
||||||
if ppos.y > nether.start then
|
local pname = player:get_player_name()
|
||||||
player:moveto({x=ppos.x, y=portal_target, z=ppos.z})
|
local in_nether = players_in_nether[pname] == true
|
||||||
update_background(player, true)
|
|
||||||
--[[minetest.kick_player(pname, "\n1. Maybe you were not allowed to teleport out of the nether."..
|
-- test if the target is valid
|
||||||
"\n2. Maybe the server lagged."..
|
if pos.y < nether.start then
|
||||||
"\n3. please rejoin")]]
|
if in_nether then
|
||||||
|
return true
|
||||||
|
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(...)
|
||||||
end
|
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
|
end
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
-- 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, player)
|
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -313,29 +299,36 @@ local particledef = {
|
|||||||
-- teleports player to neter (obsidian portal)
|
-- teleports player to neter (obsidian portal)
|
||||||
local function obsi_teleport_player(player, pos, target)
|
local function obsi_teleport_player(player, pos, target)
|
||||||
local pname = player:get_player_name()
|
local pname = player:get_player_name()
|
||||||
if table.icontains(nether.players_in_nether, pname) then
|
if players_in_nether[pname] then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local objpos = player:getpos()
|
local objpos = player:get_pos()
|
||||||
objpos.y = objpos.y+0.1 -- Fix some glitches at -8000
|
objpos.y = objpos.y+0.1 -- Fix some glitches at -8000
|
||||||
if minetest.get_node(vector.round(objpos)).name ~= "nether:portal" then
|
if minetest.get_node(vector.round(objpos)).name ~= "nether:portal" then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
if not obsidian_teleport(player, pname) then
|
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
|
||||||
-- e.g. ungenerated area
|
-- e.g. ungenerated area
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
nether.players_in_nether[#nether.players_in_nether+1] = pname
|
|
||||||
save_nether_players()
|
|
||||||
update_background(player, true)
|
|
||||||
|
|
||||||
remove_portal_essence(pos)
|
remove_portal_essence(pos)
|
||||||
|
|
||||||
minetest.sound_play("nether_portal_usual", {to_player=pname, gain=1})
|
minetest.sound_play("nether_portal_usual", {to_player=pname, gain=1})
|
||||||
--obj:setpos(target)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- abm for particles of the obsidian portal essence and for teleporting
|
-- abm for particles of the obsidian portal essence and for teleporting
|
||||||
@ -350,7 +343,8 @@ minetest.register_abm({
|
|||||||
end
|
end
|
||||||
particledef.minpos = {x=pos.x-0.25, y=pos.y-0.5, z=pos.z-0.25}
|
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.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)
|
minetest.add_particlespawner(particledef)
|
||||||
for _,obj in pairs(minetest.get_objects_inside_radius(pos, 1)) do
|
for _,obj in pairs(minetest.get_objects_inside_radius(pos, 1)) do
|
||||||
if obj:is_player() then
|
if obj:is_player() then
|
||||||
@ -483,7 +477,7 @@ local function make_portal(pos)
|
|||||||
|
|
||||||
for d=0,3 do
|
for d=0,3 do
|
||||||
for y=p1.y,p2.y do
|
for y=p1.y,p2.y do
|
||||||
local p = {}
|
local p
|
||||||
if param2 == 0 then
|
if param2 == 0 then
|
||||||
p = {x=p1.x+d, y=y, z=p1.z}
|
p = {x=p1.x+d, y=y, z=p1.z}
|
||||||
else
|
else
|
||||||
@ -562,14 +556,13 @@ minetest.after(0.1, function()
|
|||||||
on_place = function(stack, player, pt)
|
on_place = function(stack, player, pt)
|
||||||
if pt.under
|
if pt.under
|
||||||
and minetest.get_node(pt.under).name == "default:obsidian" then
|
and minetest.get_node(pt.under).name == "default:obsidian" then
|
||||||
--print("[nether] tries to enable a portal")
|
|
||||||
local done = make_portal(pt.under)
|
local done = make_portal(pt.under)
|
||||||
if done then
|
if done then
|
||||||
minetest.chat_send_player(
|
local pname = player:get_player_name()
|
||||||
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!"
|
"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
|
if not minetest.is_creative_enabled(pname) then
|
||||||
stack:take_item()
|
stack:take_item()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -581,8 +574,7 @@ end)
|
|||||||
|
|
||||||
|
|
||||||
-- a not filled square
|
-- a not filled square
|
||||||
vector.square = vector.square or
|
local function vector_square(r)
|
||||||
function(r)
|
|
||||||
local tab, n = {}, 1
|
local tab, n = {}, 1
|
||||||
for i = -r+1, r do
|
for i = -r+1, r do
|
||||||
for j = -1, 1, 2 do
|
for j = -1, 1, 2 do
|
||||||
@ -595,21 +587,20 @@ function(r)
|
|||||||
return tab
|
return tab
|
||||||
end
|
end
|
||||||
|
|
||||||
-- detects if it's a portal
|
local function is_netherportal(pos)
|
||||||
local function netherport(pos)
|
|
||||||
local x, y, z = pos.x, pos.y, pos.z
|
local x, y, z = pos.x, pos.y, pos.z
|
||||||
for _,i in pairs({-1, 3}) do
|
for _,i in pairs({-1, 3}) do
|
||||||
if minetest.get_node({x=x, y=y+i, z=z}).name ~= "nether:white" then
|
if minetest.get_node({x=x, y=y+i, z=z}).name ~= "nether:white" then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
for _,sn in pairs(vector.square(1)) do
|
for _,sn in pairs(vector_square(1)) do
|
||||||
if minetest.get_node({x=x+sn[1], y=y-1, z=z+sn[2]}).name ~= "nether:netherrack"
|
if minetest.get_node({x=x+sn[1], y=y-1, z=z+sn[2]}).name ~= "nether:netherrack"
|
||||||
or minetest.get_node({x=x+sn[1], y=y+3, z=z+sn[2]}).name ~= "nether:blood_cooked" then
|
or minetest.get_node({x=x+sn[1], y=y+3, z=z+sn[2]}).name ~= "nether:blood_cooked" then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
for _,sn in pairs(vector.square(2)) do
|
for _,sn in pairs(vector_square(2)) do
|
||||||
if minetest.get_node({x=x+sn[1], y=y-1, z=z+sn[2]}).name ~= "nether:netherrack_black"
|
if minetest.get_node({x=x+sn[1], y=y-1, z=z+sn[2]}).name ~= "nether:netherrack_black"
|
||||||
or minetest.get_node({x=x+sn[1], y=y+3, z=z+sn[2]}).name ~= "nether:wood_empty" then
|
or minetest.get_node({x=x+sn[1], y=y+3, z=z+sn[2]}).name ~= "nether:wood_empty" then
|
||||||
return
|
return
|
||||||
@ -652,60 +643,54 @@ local function set_portal(t, z,x, y)
|
|||||||
t[z][x] = y
|
t[z][x] = y
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function get_player_nodepos(player)
|
||||||
|
local pos = player:get_pos()
|
||||||
|
pos.y = pos.y + player:get_properties().collisionbox[2] + 0.5
|
||||||
|
return vector.round(pos)
|
||||||
|
end
|
||||||
|
|
||||||
-- used when a player eats that fruit in a portal
|
-- used when a player eats that fruit in a portal
|
||||||
function nether_port(player, pos)
|
function nether.teleport_player(player)
|
||||||
if not player
|
if not player then
|
||||||
or not pos
|
minetest.log("error", "[nether] Missing player.")
|
||||||
or not pos.x then
|
|
||||||
minetest.log("error", "[nether] nether_port: something failed.")
|
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
if not netherport(pos) then
|
local pos = get_player_nodepos(player)
|
||||||
|
if not is_netherportal(pos) then
|
||||||
return
|
return
|
||||||
end
|
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})
|
minetest.sound_play("nether_teleporter", {pos=pos})
|
||||||
local meta = minetest.get_meta({x=pos.x, y=pos.y-1, z=pos.z})
|
local meta = minetest.get_meta({x=pos.x, y=pos.y-1, z=pos.z})
|
||||||
if pos.y < nether.start then
|
if pos.y < nether.start then
|
||||||
set_portal(known_portals_d, pos.z,pos.x, pos.y)
|
set_portal(known_portals_d, pos.z,pos.x, pos.y)
|
||||||
nether.player_from_nether(player)
|
|
||||||
|
|
||||||
if minetest.setting_getbool("static_spawnpoint") then
|
local my = tonumber(meta:get_string("y"))
|
||||||
local stsp_conf = minetest.setting_get("static_spawnpoint")
|
local y = get_portal(known_portals_u, pos.z,pos.x)
|
||||||
pos = minetest.string_to_pos(stsp_conf)
|
if y then
|
||||||
else
|
if y ~= my then
|
||||||
local my = tonumber(meta:get_string("y"))
|
meta:set_string("y", 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
|
end
|
||||||
pos.y = y
|
else
|
||||||
|
y = my or 100
|
||||||
end
|
end
|
||||||
player:moveto(pos)
|
pos.y = y - 0.3
|
||||||
|
|
||||||
|
player_from_nether(player, pos)
|
||||||
else
|
else
|
||||||
if nether.spawn_point then
|
set_portal(known_portals_u, pos.z,pos.x, pos.y)
|
||||||
pos = nether.spawn_point
|
|
||||||
else
|
|
||||||
set_portal(known_portals_u, pos.z,pos.x, pos.y)
|
|
||||||
|
|
||||||
local my = tonumber(meta:get_string("y"))
|
local my = tonumber(meta:get_string("y"))
|
||||||
local y = get_portal(known_portals_d, pos.z,pos.x)
|
local y = get_portal(known_portals_d, pos.z,pos.x)
|
||||||
if y then
|
if y then
|
||||||
if y ~= my then
|
if y ~= my then
|
||||||
meta:set_string("y", y)
|
meta:set_string("y", y)
|
||||||
end
|
|
||||||
else
|
|
||||||
y = my or portal_target+math.random(4)
|
|
||||||
end
|
end
|
||||||
pos.y = y
|
else
|
||||||
|
y = my or portal_target+math.random(4)
|
||||||
end
|
end
|
||||||
player:moveto(pos)
|
pos.y = y - 0.3
|
||||||
nether.player_to_nether(player, true)
|
|
||||||
|
player_to_nether(player, pos)
|
||||||
end
|
end
|
||||||
minetest.sound_play("nether_teleporter", {pos=pos})
|
minetest.sound_play("nether_teleporter", {pos=pos})
|
||||||
return true
|
return true
|
||||||
|
24
nether/settings.lua
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
local default_settings = {
|
||||||
|
trap_players = true,
|
||||||
|
log_to_chat = false,
|
||||||
|
log_level = 2,
|
||||||
|
overworld_help = true,
|
||||||
|
}
|
||||||
|
|
||||||
|
nether.settings = {}
|
||||||
|
|
||||||
|
for name,dv in pairs(default_settings) do
|
||||||
|
local setting
|
||||||
|
local setting_name = "nether." .. name
|
||||||
|
if type(dv) == "boolean" then
|
||||||
|
setting = minetest.settings:get_bool(setting_name)
|
||||||
|
elseif type(dv) == "number" then
|
||||||
|
setting = tonumber(minetest.settings:get(setting_name))
|
||||||
|
else
|
||||||
|
error"[nether] Only boolean and number settings are available"
|
||||||
|
end
|
||||||
|
if setting == nil then
|
||||||
|
setting = dv
|
||||||
|
end
|
||||||
|
nether[name] = setting
|
||||||
|
end
|
23
nether/settingtypes.txt
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
# If enabled, regular players which are in the nether can leave it only with
|
||||||
|
# a nether portal and other ways of teleportation, e.g. the /spawn
|
||||||
|
# chatcommand, are blocked. Similarly, the nether can only be entered with a
|
||||||
|
# portal.
|
||||||
|
# This forces the players to investigate the nether and build a portal with
|
||||||
|
# hellish effort to go back to their home in the overworld.
|
||||||
|
# It is recommended to disable this setting in creative mode or if damage is
|
||||||
|
# disabled.
|
||||||
|
nether.trap_players (Trap players) bool true
|
||||||
|
|
||||||
|
# If enabled, show log messages in the chat and not only in debug.txt
|
||||||
|
nether.log_to_chat (Log messages to chat) bool false
|
||||||
|
|
||||||
|
# Specify how much text is printed for debugging purposes
|
||||||
|
# 0: Disabled
|
||||||
|
# 1: A bit of information
|
||||||
|
# 2: Acceptable amount of information
|
||||||
|
# 3: Lots of text
|
||||||
|
nether.log_level (Log level) int 2 0 3
|
||||||
|
|
||||||
|
# If disabled, players cannot view the nether guide with /nether_help
|
||||||
|
# in the overworld.
|
||||||
|
nether.overworld_help (Overworld help) bool true
|
BIN
nether/sounds/nether_dig.1.ogg
Executable file → Normal file
BIN
nether/sounds/nether_dig.2.ogg
Executable file → Normal file
BIN
nether/sounds/nether_dug.1.ogg
Executable file → Normal file
BIN
nether/sounds/nether_dug.2.ogg
Executable file → Normal file
BIN
nether/sounds/nether_extract_blood.1.ogg
Executable file → Normal file
BIN
nether/sounds/nether_extract_blood.2.ogg
Executable file → Normal file
BIN
nether/sounds/nether_extract_blood.3.ogg
Executable file → Normal file
BIN
nether/sounds/nether_extract_blood.4.ogg
Executable file → Normal file
BIN
nether/sounds/nether_extract_blood.5.ogg
Executable file → Normal file
BIN
nether/sounds/nether_extract_blood.6.ogg
Executable file → Normal file
BIN
nether/sounds/nether_extract_blood.7.ogg
Executable file → Normal file
BIN
nether/sounds/nether_footstep.1.ogg
Executable file → Normal file
BIN
nether/sounds/nether_footstep.2.ogg
Executable file → Normal file
BIN
nether/sounds/nether_footstep.3.ogg
Executable file → Normal file
BIN
nether/sounds/nether_pearl.ogg
Executable file → Normal file
BIN
nether/sounds/nether_portal_usual.ogg
Executable file → Normal file
BIN
nether/sounds/nether_remove_leaf.1.ogg
Executable file → Normal file
BIN
nether/sounds/nether_remove_leaf.2.ogg
Executable file → Normal file
BIN
nether/sounds/nether_remove_leaf.3.ogg
Executable file → Normal file
BIN
nether/sounds/nether_teleporter.1.ogg
Executable file → Normal file
BIN
nether/sounds/nether_teleporter.2.ogg
Executable file → Normal file
BIN
nether/sounds/nether_teleporter.3.ogg
Executable file → Normal file
0
nether/textures/nether_axe_netherrack.png
Executable file → Normal file
Before Width: | Height: | Size: 198 B After Width: | Height: | Size: 198 B |
0
nether/textures/nether_axe_netherrack_blue.png
Executable file → Normal file
Before Width: | Height: | Size: 220 B After Width: | Height: | Size: 220 B |
0
nether/textures/nether_axe_white.png
Executable file → Normal file
Before Width: | Height: | Size: 289 B After Width: | Height: | Size: 289 B |
0
nether/textures/nether_bark.png
Executable file → Normal file
Before Width: | Height: | Size: 440 B After Width: | Height: | Size: 440 B |
0
nether/textures/nether_blood.png
Executable file → Normal file
Before Width: | Height: | Size: 448 B After Width: | Height: | Size: 448 B |
0
nether/textures/nether_blood_cooked.png
Executable file → Normal file
Before Width: | Height: | Size: 541 B After Width: | Height: | Size: 541 B |
0
nether/textures/nether_blood_empty.png
Executable file → Normal file
Before Width: | Height: | Size: 474 B After Width: | Height: | Size: 474 B |
0
nether/textures/nether_blood_extracted.png
Executable file → Normal file
Before Width: | Height: | Size: 303 B After Width: | Height: | Size: 303 B |
0
nether/textures/nether_blood_extractor.png
Executable file → Normal file
Before Width: | Height: | Size: 726 B After Width: | Height: | Size: 726 B |
0
nether/textures/nether_blood_side.png
Executable file → Normal file
Before Width: | Height: | Size: 478 B After Width: | Height: | Size: 478 B |
0
nether/textures/nether_blood_side_cooked.png
Executable file → Normal file
Before Width: | Height: | Size: 493 B After Width: | Height: | Size: 493 B |
0
nether/textures/nether_blood_side_empty.png
Executable file → Normal file
Before Width: | Height: | Size: 401 B After Width: | Height: | Size: 401 B |
0
nether/textures/nether_blood_stem.png
Executable file → Normal file
Before Width: | Height: | Size: 446 B After Width: | Height: | Size: 446 B |
0
nether/textures/nether_blood_stem_cooked.png
Executable file → Normal file
Before Width: | Height: | Size: 607 B After Width: | Height: | Size: 607 B |
0
nether/textures/nether_blood_stem_empty.png
Executable file → Normal file
Before Width: | Height: | Size: 532 B After Width: | Height: | Size: 532 B |
0
nether/textures/nether_blood_stem_top.png
Executable file → Normal file
Before Width: | Height: | Size: 442 B After Width: | Height: | Size: 442 B |
0
nether/textures/nether_blood_stem_top_cooked.png
Executable file → Normal file
Before Width: | Height: | Size: 764 B After Width: | Height: | Size: 764 B |
0
nether/textures/nether_blood_stem_top_empty.png
Executable file → Normal file
Before Width: | Height: | Size: 544 B After Width: | Height: | Size: 544 B |
0
nether/textures/nether_blood_top.png
Executable file → Normal file
Before Width: | Height: | Size: 463 B After Width: | Height: | Size: 463 B |
0
nether/textures/nether_blood_top_cooked.png
Executable file → Normal file
Before Width: | Height: | Size: 709 B After Width: | Height: | Size: 709 B |
0
nether/textures/nether_blood_top_empty.png
Executable file → Normal file
Before Width: | Height: | Size: 471 B After Width: | Height: | Size: 471 B |
0
nether/textures/nether_dirt.png
Executable file → Normal file
Before Width: | Height: | Size: 673 B After Width: | Height: | Size: 673 B |
0
nether/textures/nether_dirt_normal.png
Executable file → Normal file
Before Width: | Height: | Size: 449 B After Width: | Height: | Size: 449 B |
0
nether/textures/nether_dirt_top.png
Executable file → Normal file
Before Width: | Height: | Size: 699 B After Width: | Height: | Size: 699 B |
0
nether/textures/nether_dirt_top_normal.png
Executable file → Normal file
Before Width: | Height: | Size: 481 B After Width: | Height: | Size: 481 B |
0
nether/textures/nether_dirt_top_side.png
Executable file → Normal file
Before Width: | Height: | Size: 807 B After Width: | Height: | Size: 807 B |
0
nether/textures/nether_dirt_top_side_normal.png
Executable file → Normal file
Before Width: | Height: | Size: 669 B After Width: | Height: | Size: 669 B |
0
nether/textures/nether_dirt_transition.png
Executable file → Normal file
Before Width: | Height: | Size: 670 B After Width: | Height: | Size: 670 B |
0
nether/textures/nether_dirt_transition_normal.png
Executable file → Normal file
Before Width: | Height: | Size: 528 B After Width: | Height: | Size: 528 B |
0
nether/textures/nether_fim.png
Executable file → Normal file
Before Width: | Height: | Size: 222 B After Width: | Height: | Size: 222 B |
0
nether/textures/nether_forest_planks.png
Executable file → Normal file
Before Width: | Height: | Size: 488 B After Width: | Height: | Size: 488 B |
0
nether/textures/nether_forest_wood.png
Executable file → Normal file
Before Width: | Height: | Size: 775 B After Width: | Height: | Size: 775 B |
0
nether/textures/nether_forest_wood_normal.png
Executable file → Normal file
Before Width: | Height: | Size: 550 B After Width: | Height: | Size: 550 B |
0
nether/textures/nether_fruit.png
Executable file → Normal file
Before Width: | Height: | Size: 244 B After Width: | Height: | Size: 244 B |
0
nether/textures/nether_fruit_bottom.png
Executable file → Normal file
Before Width: | Height: | Size: 211 B After Width: | Height: | Size: 211 B |
0
nether/textures/nether_fruit_leaf.png
Executable file → Normal file
Before Width: | Height: | Size: 359 B After Width: | Height: | Size: 359 B |
0
nether/textures/nether_fruit_leaves.png
Executable file → Normal file
Before Width: | Height: | Size: 519 B After Width: | Height: | Size: 519 B |
0
nether/textures/nether_fruit_no_leaf.png
Executable file → Normal file
Before Width: | Height: | Size: 529 B After Width: | Height: | Size: 529 B |
0
nether/textures/nether_fruit_top.png
Executable file → Normal file
Before Width: | Height: | Size: 214 B After Width: | Height: | Size: 214 B |
0
nether/textures/nether_glowflower.png
Executable file → Normal file
Before Width: | Height: | Size: 516 B After Width: | Height: | Size: 516 B |
0
nether/textures/nether_grass.png
Executable file → Normal file
Before Width: | Height: | Size: 184 B After Width: | Height: | Size: 184 B |
0
nether/textures/nether_grass_big.png
Executable file → Normal file
Before Width: | Height: | Size: 352 B After Width: | Height: | Size: 352 B |
0
nether/textures/nether_grass_dried.png
Executable file → Normal file
Before Width: | Height: | Size: 218 B After Width: | Height: | Size: 218 B |
0
nether/textures/nether_grass_middle.png
Executable file → Normal file
Before Width: | Height: | Size: 232 B After Width: | Height: | Size: 232 B |
0
nether/textures/nether_grass_small.png
Executable file → Normal file
Before Width: | Height: | Size: 186 B After Width: | Height: | Size: 186 B |
0
nether/textures/nether_hotbed.png
Executable file → Normal file
Before Width: | Height: | Size: 280 B After Width: | Height: | Size: 280 B |
0
nether/textures/nether_leaves.png
Executable file → Normal file
Before Width: | Height: | Size: 427 B After Width: | Height: | Size: 427 B |
0
nether/textures/nether_netherrack.png
Executable file → Normal file
Before Width: | Height: | Size: 603 B After Width: | Height: | Size: 603 B |
0
nether/textures/nether_netherrack_black.png
Executable file → Normal file
Before Width: | Height: | Size: 582 B After Width: | Height: | Size: 582 B |
0
nether/textures/nether_netherrack_black_normal.png
Executable file → Normal file
Before Width: | Height: | Size: 490 B After Width: | Height: | Size: 490 B |
0
nether/textures/nether_netherrack_blue.png
Executable file → Normal file
Before Width: | Height: | Size: 831 B After Width: | Height: | Size: 831 B |
0
nether/textures/nether_netherrack_blue_normal.png
Executable file → Normal file
Before Width: | Height: | Size: 693 B After Width: | Height: | Size: 693 B |
0
nether/textures/nether_netherrack_brick.png
Executable file → Normal file
Before Width: | Height: | Size: 682 B After Width: | Height: | Size: 682 B |
0
nether/textures/nether_netherrack_brick_black.png
Executable file → Normal file
Before Width: | Height: | Size: 547 B After Width: | Height: | Size: 547 B |
0
nether/textures/nether_netherrack_brick_blue.png
Executable file → Normal file
Before Width: | Height: | Size: 726 B After Width: | Height: | Size: 726 B |
0
nether/textures/nether_netherrack_normal.png
Executable file → Normal file
Before Width: | Height: | Size: 533 B After Width: | Height: | Size: 533 B |
0
nether/textures/nether_netherrack_soil.png
Executable file → Normal file
Before Width: | Height: | Size: 397 B After Width: | Height: | Size: 397 B |
0
nether/textures/nether_netherrack_soil_normal.png
Executable file → Normal file
Before Width: | Height: | Size: 491 B After Width: | Height: | Size: 491 B |
0
nether/textures/nether_netherrack_tiled.png
Executable file → Normal file
Before Width: | Height: | Size: 724 B After Width: | Height: | Size: 724 B |
0
nether/textures/nether_netherrack_tiled_normal.png
Executable file → Normal file
Before Width: | Height: | Size: 521 B After Width: | Height: | Size: 521 B |
0
nether/textures/nether_pearl.png
Executable file → Normal file
Before Width: | Height: | Size: 216 B After Width: | Height: | Size: 216 B |
0
nether/textures/nether_pick_mushroom.png
Executable file → Normal file
Before Width: | Height: | Size: 375 B After Width: | Height: | Size: 375 B |