1
0
mirror of https://github.com/HybridDog/nether-pack.git synced 2025-06-30 15:10:52 +02:00

1 Commits

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

0
.gitignore vendored Normal file → Executable file
View File

View File

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

View File

@ -1,15 +1,22 @@
For a description of this Minetest mod, please refer to the forum topic:
https://forum.minetest.net/viewtopic.php?f=9&t=10265
[Mod] nether-pack [nether-pack]
This is a modified version of lkjoel's nether mod.
Look here if you want to see the differences:
https://github.com/HybridDog/minetest-nether/compare/lkjoel:master...master
Sadly lkjoel's one disappeared…
**Depends:** see [depends.txt](https://raw.githubusercontent.com/HybridDog/nether-pack/master/nether/depends.txt)
**License:** see [LICENSE.txt](https://raw.githubusercontent.com/HybridDog/nether-pack/master/LICENSE.txt)
**Download:** [zip](https://github.com/HybridDog/nether-pack/archive/master.zip), [tar.gz](https://github.com/HybridDog/nether-pack/tarball/master)
this happens really selden to me
![I'm a screenshot!](http://i.imgur.com/pMZYqt9.png)
If you got ideas or found bugs, please tell them to me.
[How to install a mod?](http://wiki.minetest.net/Installing_Mods)
TODO:
* Find a way to get the perlin noise inside [-1; 1] or use another noise
* Add some node which containing items to the simple pyramid "buildings"
* Change the sky background, fog, etc. in the nether
* Improve the guide formspec.
Writing it in Markdown would be nice.
These could be useful:
* https://forum.minetest.net/viewtopic.php?t=23855
Minetest Bedrock Markup Language
* https://github.com/mpeterv/markdown
Markdown to HTML converter; Minetest formspecs support HTML
— find a way to get the perlin noise inside [-1; 1] or use another noise
— add something containing items to that buildings

1
modpack.txt Normal file → Executable file
View File

@ -1 +0,0 @@
0

View File

@ -1,15 +0,0 @@
read_globals = {
-- Defined by Minetest
"minetest", "vector", "PseudoRandom", "VoxelArea", "ItemStack", "dump",
"string",
-- Mods
"default", "stairs", "creative"
}
globals = {"nether"}
ignore = {
"212",
-- Unused argument
"411", "421", "422", "423", "431", "432",
-- Shadowing
}

2
nether/crafting.lua Normal file → Executable file
View File

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

7
nether/depends.txt Executable file
View File

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

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

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

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

@ -68,13 +68,10 @@ local guide_infos = {
{"text", "One contains 4 kinds of blocks :"},
{"image", {1, 1, cube("nether_blood.png"), 1}},
{"image", {1, 1,
cube("nether_blood_top.png",
"nether_blood.png^nether_blood_side.png",
"nether_blood.png^nether_blood_side.png"),
cube("nether_blood_top.png", "nether_blood.png^nether_blood_side.png", "nether_blood.png^nether_blood_side.png"),
2}},
{"image", {1, 1, "nether_fruit.png", 3}},
{"image", {1, 1, cube("nether_blood_stem_top.png",
"nether_blood_stem.png", "nether_blood_stem.png")}},
{"image", {1, 1, cube("nether_blood_stem_top.png", "nether_blood_stem.png", "nether_blood_stem.png")}},
{"y", 0.1},
{"text", "Blood stem, blood, blood head and nether fruit"},
{"y", 0.1},
@ -126,14 +123,10 @@ local guide_infos = {
"After that it's recommended to use cooked blood nodes."},
{"y", 0.1},
{"text", "Some nether items can be cooked:"},
{"image", {1, 1, cube("nether_blood_stem_top_cooked.png",
"nether_blood_stem_cooked.png", "nether_blood_stem_cooked.png"),
0.35}},
{"image", {1, 1, cube("nether_blood_stem_top_cooked.png", "nether_blood_stem_cooked.png", "nether_blood_stem_cooked.png"), 0.35}},
{"image", {1, 1, cube("nether_blood_cooked.png"), 1.6}},
{"image", {1, 1,
cube("nether_blood_top_cooked.png",
"nether_blood_cooked.png^nether_blood_side_cooked.png",
"nether_blood_cooked.png^nether_blood_side_cooked.png"),
cube("nether_blood_top_cooked.png", "nether_blood_cooked.png^nether_blood_side_cooked.png", "nether_blood_cooked.png^nether_blood_side_cooked.png"),
2.9}},
{"image", {1, 1, cube("nether_wood_cooked.png"), 4.3}},
{"y", 1.2},
@ -149,18 +142,14 @@ local guide_infos = {
{"text", "Here you can find out information about the nether extractor."},
{"y", 0.2},
{"text", "Here you can see its craft recipe:"},
{"image", {0.5, 0.5, cube("nether_blood_top_cooked.png",
"nether_blood_cooked.png^nether_blood_side_cooked.png",
"nether_blood_cooked.png^nether_blood_side_cooked.png"), 0.5}},
{"image", {0.5, 0.5, cube("nether_blood_top_cooked.png", "nether_blood_cooked.png^nether_blood_side_cooked.png", "nether_blood_cooked.png^nether_blood_side_cooked.png"), 0.5}},
{"image", {0.5, 0.5, cube("nether_netherrack_brick.png"), 1}},
{"image", {0.5, 0.5, cube("nether_netherrack_brick.png")}},
{"image", {0.5, 0.5, cube("nether_blood_extractor.png"), 2.5}},
{"image", {0.5, 0.5, "nether_shroom_stem.png", 0.5}},
{"image", {0.5, 0.5, cube("nether_blood_cooked.png"), 1}},
{"image", {0.5, 0.5, cube("nether_blood_cooked.png")}},
{"image", {0.5, 0.5, cube("nether_blood_stem_top_cooked.png",
"nether_blood_stem_cooked.png", "nether_blood_stem_cooked.png"),
0.5}},
{"image", {0.5, 0.5, cube("nether_blood_stem_top_cooked.png", "nether_blood_stem_cooked.png", "nether_blood_stem_cooked.png"), 0.5}},
{"image", {0.5, 0.5, cube("nether_netherrack_brick.png"), 1}},
{"image", {0.5, 0.5, cube("nether_netherrack_brick.png")}},
{"y", 0.2},
@ -258,11 +247,11 @@ local guide_infos = {
{"y", 0.3},
{"text", "A nether portal requires following nodes:"},
{"y", 0.05},
{"text", "25 empty nether wooden planks\n"..
"16 black netherrack\n"..
{"text", "21 empty nether wooden planks\n"..
"12 blue netherrack bricks\n"..
"12 black netherrack\n"..
"8 red netherrack\n"..
"8 cooked nether blood\n"..
"8 cooked nether wood\n"..
"4 nether fruits\n"..
"2 siwtonic blocks"},
{"y", 0.2},
@ -302,7 +291,7 @@ local guide_size = {x=40, y=10, cx=0.2, cy=0.2}
local formspec_offset = {x=0.25, y=0.50}
local font_size
if minetest.is_singleplayer() then
font_size = tonumber(minetest.settings:get("font_size")) or 13
font_size = tonumber(minetest.setting_get("font_size")) or 13
else
font_size = 13
end
@ -316,7 +305,6 @@ local guide_forms = {
-- change the infos to formspecs
for n,data in ipairs(guide_infos) do
local html_text = ""
local form = ""
local y = 0
local x = guide_size.cx
@ -327,64 +315,13 @@ for n,data in ipairs(guide_infos) do
elseif typ == "x" then
x = math.max(x, content)
elseif typ == "text" then
html_text = html_text .. content .. "\n"
local tab = minetest.wrap_text(content, guide_size.fx, true)
--local tab = minetest.splittext(content, guide_size.fx)
local l = guide_size.cx
for _,str in ipairs(tab) do
--~ form = form.."label["..guide_size.cx ..","..guide_size.cy+y..";"..str.."]"
y = y+guide_size.fy
l = math.max(l, #str)
end
x = math.max(x, l/font_size)
elseif typ == "image" then
local w, h, texture_name, px, py = unpack(content)
if not px then
--~ form = form.."image["..guide_size.cx..","..guide_size.cy+y+h*0.3 ..";"..w..","..h..";"..texture_name.."]"
html_text = html_text ..
("<img name=%s width=%g height=%g>\n"):format(
texture_name, w, h)
y = y+h
else
px = guide_size.cx+px
py = py or 0
html_text = html_text ..
("<img name=%s width=%g height=%g>\n"):format(
texture_name, w, h)
--~ 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 = ("formspec_version[4]size[%g,%g;]hypertext[0,0;%g,%g;html;%s]button[%g,%g;1,2;quit;Back]"
):format(
x * 1.8, y + 1,
x * 1.8, y,
minetest.formspec_escape(html_text),
0.5 * x - 0.5, y)
guide_forms[n] = {data.description, form}
end
print(dump(guide_forms))
--[[
for n,data in ipairs(guide_infos) do
local form = ""
local y = 0
local x = guide_size.cx
for _,i in ipairs(data) do
local typ, content = unpack(i)
if typ == "y" then
y = y+content
elseif typ == "x" then
x = math.max(x, content)
elseif typ == "text" then
local tab = minetest.wrap_text(content, guide_size.fx, true)
local l = guide_size.cx
for _,str in ipairs(tab) do
--[[for _,str in ipairs(tab) do
form = form.."label["..guide_size.cx ..","..guide_size.cy+y..";"..str.."]"
y = y+guide_size.fy
l = math.max(l, #str)
end
end]]
x = math.max(x, l/font_size)
elseif typ == "image" then
local w, h, texture_name, px, py = unpack(content)
@ -403,7 +340,6 @@ for n,data in ipairs(guide_infos) do
form = "size["..x*1.8 ..","..y+1 ..";]"..form.."button["..x/2-0.5 ..","..y ..";1,2;quit;Back]"
guide_forms[n] = {data.description, form}
end
--]]
local desc_tab = {}
for n,i in ipairs(guide_forms) do
@ -411,12 +347,11 @@ for n,i in ipairs(guide_forms) do
end
-- creates contents formspec
local y = 0
for y,i in ipairs(guide_forms) do
local desc = i[1]
local s = #desc * 1.3 / font_size + 1.5
guide_forms.contents = guide_forms.contents ..
"button[" .. guide_size.cx * 12 / s - 0.5 .. "," ..
guide_size.cy + y / 1.3 .. ";" .. s .. ",1;name;" .. desc .. "]"
local desc, form = unpack(i)
local s = #desc*1.3/font_size+1.5
guide_forms.contents = guide_forms.contents.."button["..guide_size.cx*12/s-0.5 ..","..guide_size.cy+y/1.3 ..";"..s..",1;name;"..desc.."]"
end
-- shows the contents of the formspec
@ -451,12 +386,10 @@ minetest.register_chatcommand("nether_help", {
minetest.chat_send_player(name, "Something went wrong.")
return false
end
if player:get_pos().y > nether.start then
minetest.chat_send_player(name,
"Usually you don't neet this guide here. " ..
"You can view it in the nether.")
--[[ 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
end --]]
minetest.chat_send_player(name, "Showing guide...")
show_guide(name)
return true

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

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

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

@ -35,19 +35,11 @@ local function add_fence(name)
end
--]]
local creative_installed = minetest.global_exists("creative")
local function digging_allowed(player, v)
if not player then
return false
end
if creative_installed
and creative.is_enabled_for(player:get_player_name()) then
return true
end
local tool = player:get_wielded_item():get_name()
tool = minetest.registered_tools[tool] or tool == ""
and minetest.registered_items[tool]
local tool = minetest.registered_tools[player:get_wielded_item():get_name()]
if not tool
or not tool.tool_capabilities then
return false
@ -212,8 +204,7 @@ add_more_nodes("blood_empty")
minetest.register_node("nether:blood_top", {
description = "Nether Blood Head",
tiles = {"nether_blood_top.png", "nether_blood.png",
"nether_blood.png^nether_blood_side.png"},
tiles = {"nether_blood_top.png", "nether_blood.png", "nether_blood.png^nether_blood_side.png"},
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=1},
sounds = default.node_sound_wood_defaults(),
})
@ -221,8 +212,7 @@ add_more_nodes("blood_top")
minetest.register_node("nether:blood_top_cooked", {
description = "Cooked Nether Blood Head",
tiles = {"nether_blood_top_cooked.png", "nether_blood_cooked.png",
"nether_blood_cooked.png^nether_blood_side_cooked.png"},
tiles = {"nether_blood_top_cooked.png", "nether_blood_cooked.png", "nether_blood_cooked.png^nether_blood_side_cooked.png"},
groups = {nether=3},
sounds = nether_sound,
furnace_burntime = 10,
@ -234,8 +224,7 @@ add_more_nodes("blood_top_cooked")
minetest.register_node("nether:blood_top_empty", {
description = "Nether Blood Head Extracted",
tiles = {"nether_blood_top_empty.png", "nether_blood_empty.png",
"nether_blood_empty.png^nether_blood_side_empty.png"},
tiles = {"nether_blood_top_empty.png", "nether_blood_empty.png", "nether_blood_empty.png^nether_blood_side_empty.png"},
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=1},
sounds = default.node_sound_wood_defaults(),
})
@ -244,8 +233,7 @@ add_more_nodes("blood_top_empty")
minetest.register_node("nether:blood_stem", {
description = "Nether Blood Stem",
tiles = {"nether_blood_stem_top.png", "nether_blood_stem_top.png",
"nether_blood_stem.png"},
tiles = {"nether_blood_stem_top.png", "nether_blood_stem_top.png", "nether_blood_stem.png"},
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=1},
sounds = default.node_sound_wood_defaults(),
})
@ -253,8 +241,7 @@ add_more_nodes("blood_stem")
minetest.register_node("nether:blood_stem_cooked", {
description = "Cooked Nether Blood Stem",
tiles = {"nether_blood_stem_top_cooked.png",
"nether_blood_stem_top_cooked.png", "nether_blood_stem_cooked.png"},
tiles = {"nether_blood_stem_top_cooked.png", "nether_blood_stem_top_cooked.png", "nether_blood_stem_cooked.png"},
groups = {nether=3},
sounds = nether_sound,
furnace_burntime = 30,
@ -266,8 +253,7 @@ add_more_nodes("blood_stem_cooked")
minetest.register_node("nether:blood_stem_empty", {
description = "Nether Blood Stem Extracted",
tiles = {"nether_blood_stem_top_empty.png",
"nether_blood_stem_top_empty.png", "nether_blood_stem_empty.png"},
tiles = {"nether_blood_stem_top_empty.png", "nether_blood_stem_top_empty.png", "nether_blood_stem_empty.png"},
groups = {tree=1, choppy=2, oddly_breakable_by_hand=1},
sounds = default.node_sound_wood_defaults(),
})
@ -359,10 +345,7 @@ minetest.override_item("riesenpilz:nether_shroom", {
minetest.register_node("nether:apple", {
description = "Nether Fruit",
drawtype = "nodebox",
tiles = {"nether_fruit_top.png", "nether_fruit_bottom.png",
"nether_fruit.png", "nether_fruit.png^[transformFX",
"nether_fruit.png^[transformFX", "nether_fruit.png"},
use_texture_alpha = "opaque",
tiles = {"nether_fruit_top.png", "nether_fruit_bottom.png", "nether_fruit.png", "nether_fruit.png^[transformFX", "nether_fruit.png^[transformFX", "nether_fruit.png"},
node_box = {
type = "fixed",
fixed = {
@ -390,9 +373,21 @@ minetest.register_node("nether:apple", {
return
end
itemstack:take_item()
if nether.teleport_player(user) then
if nether_port(user, vector.round(user:getpos())) then
return itemstack
end
local p_hunger = tonumber(hbhunger.hunger[user:get_player_name()])
if not p_hunger then
return
end
p_hunger = p_hunger + 9
if p_hunger > 30 then
p_hunger = 30
end
hbhunger.hunger[user:get_player_name()] = p_hunger
hbhunger.set_hunger(user)
local amount = math.random(4, 6)
inv:add_item("main", {name="nether:blood_extracted", count=math.floor(amount/3)})
user:set_hp(user:get_hp()-amount)
@ -517,10 +512,8 @@ minetest.register_node("nether:tree", {
minetest.register_node("nether:tree_corner", {
description = "Nether Trunk Corner",
tiles = {"nether_tree.png^[transformR180", "nether_tree_top.png",
"nether_tree_corner.png^[transformFY",
"nether_tree_corner.png^[transformR180", "nether_tree.png",
"nether_tree_top.png"},
tiles = {"nether_tree.png^[transformR180", "nether_tree_top.png", "nether_tree_corner.png^[transformFY",
"nether_tree_corner.png^[transformR180", "nether_tree.png", "nether_tree_top.png"},
paramtype2 = "facedir",
is_ground_content = false,
groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,not_in_creative_inventory=1},
@ -541,7 +534,7 @@ minetest.register_node("nether:leaves", {
description = "Nether Leaves",
drawtype = "plantlike",
waving = 1,
visual_scale = math.sqrt(2) + 0.01,
visual_scale = math.sqrt(math.sqrt(2)),
tiles = {"nether_leaves.png"},
inventory_image = "nether_leaves.png",
wield_image = "nether_leaves.png",
@ -642,7 +635,7 @@ minetest.register_node("nether:portal", {
light_source = 12,
paramtype = "light",
sunlight_propagates = true,
use_texture_alpha = "blend",
use_texture_alpha = true,
walkable = false,
pointable = false,
buildable_to = false,
@ -832,51 +825,53 @@ minetest.register_craftitem("nether:hotbed", {
})
-- Modif MFF the entire tool
minetest.register_tool("nether:pick_mushroom", {
description = "Nether Mushroom Pickaxe",
inventory_image = "nether_pick_mushroom.png",
tool_capabilities = {
max_drop_level=0,
groupcaps={
cracky = {times={[3]=3}, uses=1, maxlevel=1},
nether = {times={[3]=3}, uses=1, maxlevel=1},
cracky = {times={[3]=3.0}, uses=5, maxlevel=1},
nether = {times={[3]=3}, uses=5, maxlevel=1},
},
damage_groups = {fleshy=2},
},
})
minetest.register_tool("nether:pick_wood", {
minetest.register_tool("nether:pick_wood", { -- Modif MFF the entire tool
description = "Nether Wood Pickaxe",
inventory_image = "nether_pick_wood.png",
tool_capabilities = {
full_punch_interval = 1.2,
max_drop_level=0,
groupcaps={
cracky = {times={[3]=1.6}, uses=10, maxlevel=1},
nether = {times={[2]=6, [3]=1.6}, uses=10, maxlevel=1},
cracky = {times={[3]=1.60}, uses=10, maxlevel=1},
nether = {times={[2]=6, [3]=1.60}, uses=10, maxlevel=1},
},
damage_groups = {fleshy=2},
},
})
minetest.register_tool("nether:pick_netherrack", {
minetest.register_tool("nether:pick_netherrack", { -- Modif MFF the entire tool
description = "Netherrack Pickaxe",
inventory_image = "nether_pick_netherrack.png",
tool_capabilities = {
full_punch_interval = 1.3,
full_punch_interval = 1.2,
max_drop_level=0,
groupcaps={
cracky = {times={[2]=2.0, [3]=1.20}, uses=20, maxlevel=1},
nether = {times={[1]=16, [2]=2, [3]=1.20}, uses=20, maxlevel=1},
cracky = {times={[2]=2.00, [3]=1.20}, uses=20, maxlevel=2},
nether = {times={[1]=16, [2]=2.00, [3]=1.20}, uses=20, maxlevel=1},
},
damage_groups = {fleshy=3},
},
})
minetest.register_tool("nether:pick_netherrack_blue", {
minetest.register_tool("nether:pick_netherrack_blue", { -- Modif MFF the entire tool
description = "Blue Netherrack Pickaxe",
inventory_image = "nether_pick_netherrack_blue.png",
tool_capabilities = {
full_punch_interval = 1.0,
full_punch_interval = 0.8,
max_drop_level=1,
groupcaps={
cracky = {times={[1]=4.00, [2]=1.60, [3]=0.80}, uses=30, maxlevel=2},
@ -886,60 +881,62 @@ minetest.register_tool("nether:pick_netherrack_blue", {
},
})
minetest.register_tool("nether:pick_white", {
minetest.register_tool("nether:pick_white", { -- Modif MFF the entire tool
description = "Siwtonic Pickaxe",
inventory_image = "nether_pick_white.png",
tool_capabilities = {
full_punch_interval = 0.9,
full_punch_interval = 0.5,
max_drop_level=3,
groupcaps={
cracky = {times={[1]=1, [2]=0.8, [3]=0.3}, uses=180, maxlevel=3},
nether = {times={[1]=1, [2]=0.5, [3]=0.3}, uses=180, maxlevel=3},
cracky = {times={[1]=1.75, [2]=0.85, [3]=0.40}, uses=125, maxlevel=3},
nether = {times={[1]=1, [2]=0.5, [3]=0.3}, uses=125, maxlevel=3},
},
damage_groups = {fleshy=5},
},
})
minetest.register_tool("nether:axe_netherrack", {
-- Nether Axe
minetest.register_tool("nether:axe_netherrack", { -- Modif MFF the entire tool
description = "Netherrack Axe",
inventory_image = "nether_axe_netherrack.png",
tool_capabilities = {
full_punch_interval = 1.3,
max_drop_level=0,
groupcaps={
choppy={times={[1]=2.9, [2]=1.9, [3]=1.4}, uses=20, maxlevel=1},
choppy={times={[1]=3.00, [2]=1.00, [3]=0.60}, uses=20, maxlevel=2},
},
damage_groups = {fleshy=4},
damage_groups = {fleshy=3},
},
})
minetest.register_tool("nether:axe_netherrack_blue", {
minetest.register_tool("nether:axe_netherrack_blue", { -- Modif MFF the entire tool
description = "Blue Netherrack Axe",
inventory_image = "nether_axe_netherrack_blue.png",
tool_capabilities = {
full_punch_interval = 0.9,
max_drop_level=1,
groupcaps={
choppy={times={[1]=2.5, [2]=1.5, [3]=1}, uses=30, maxlevel=2},
choppy={times={[1]=2.00, [2]=0.80, [3]=0.40}, uses=30, maxlevel=2},
},
damage_groups = {fleshy=6},
damage_groups = {fleshy=4},
},
})
minetest.register_tool("nether:axe_white", {
minetest.register_tool("nether:axe_white", { -- Modif MFF the entire tool
description = "Siwtonic Axe",
inventory_image = "nether_axe_white.png",
tool_capabilities = {
full_punch_interval = 0.9,
max_drop_level=1,
groupcaps={
choppy={times={[1]=1.2, [2]=0.5, [3]=0.3}, uses=180, maxlevel=2},
choppy={times={[1]=0.90, [2]=0.45, [3]=0.20}, uses=125, maxlevel=3},
},
damage_groups = {fleshy=8},
damage_groups = {fleshy=5},
},
})
minetest.register_tool("nether:shovel_netherrack", {
-- Nether Shovel
minetest.register_tool("nether:shovel_netherrack", { -- Modif MFF the entire tool
description = "Netherrack Shovel",
inventory_image = "nether_shovel_netherrack.png",
wield_image = "nether_shovel_netherrack.png^[transformR90",
@ -947,13 +944,13 @@ minetest.register_tool("nether:shovel_netherrack", {
full_punch_interval = 1.4,
max_drop_level=0,
groupcaps={
crumbly = {times={[1]=1.7, [2]=1.1, [3]=0.45}, uses=22, maxlevel=2},
crumbly = {times={[1]=3.30, [2]=2.20, [3]=1.32}, uses=20, maxlevel=2},
},
damage_groups = {fleshy=2},
damage_groups = {fleshy=3},
},
})
minetest.register_tool("nether:shovel_netherrack_blue", {
minetest.register_tool("nether:shovel_netherrack_blue", { -- Modif MFF the entire tool
description = "Blue Netherrack Shovel",
inventory_image = "nether_shovel_netherrack_blue.png",
wield_image = "nether_shovel_netherrack_blue.png^[transformR90",
@ -961,13 +958,13 @@ minetest.register_tool("nether:shovel_netherrack_blue", {
full_punch_interval = 1.1,
max_drop_level=1,
groupcaps={
crumbly = {times={[1]=1.4, [2]=0.8, [3]=0.35}, uses=50, maxlevel=2},
crumbly = {times={[1]=4.40, [2]=1.76, [3]=0.88}, uses=30, maxlevel=2},
},
damage_groups = {fleshy=3},
damage_groups = {fleshy=4},
},
})
minetest.register_tool("nether:shovel_white", {
minetest.register_tool("nether:shovel_white", { -- Modif MFF the entire tool
description = "Siwtonic Shovel",
inventory_image = "nether_shovel_white.png",
wield_image = "nether_shovel_white.png^[transformR90",
@ -975,56 +972,49 @@ minetest.register_tool("nether:shovel_white", {
full_punch_interval = 1,
max_drop_level=1,
groupcaps={
crumbly = {times={[1]=0.95, [2]=0.45, [3]=0.1}, uses=151, maxlevel=3},
},
damage_groups = {fleshy=4},
},
})
minetest.register_tool("nether:sword_netherrack", {
description = "Netherrack Sword",
inventory_image = "nether_sword_netherrack.png",
tool_capabilities = {
full_punch_interval = 1,
max_drop_level=0,
groupcaps={
snappy={times={[2]=1.3, [3]=0.38}, uses=40, maxlevel=1},
crumbly = {times={[1]=1.93, [2]=0.94, [3]=0.44}, uses=125, maxlevel=3},
},
damage_groups = {fleshy=5},
},
})
minetest.register_tool("nether:sword_netherrack_blue", {
description = "Blue Netherrack Sword",
inventory_image = "nether_sword_netherrack_blue.png",
-- Nether Sword
minetest.register_tool("nether:sword_netherrack", { -- Modif MFF the entire tool
description = "Netherrack Sword",
inventory_image = "nether_sword_netherrack.png",
tool_capabilities = {
full_punch_interval = 0.8,
max_drop_level=1,
full_punch_interval = 0.9,
max_drop_level=0,
groupcaps={
snappy={times={[1]=2.5, [2]=1.1, [3]=0.33}, uses=40, maxlevel=2},
snappy={times={[2]=1.3, [3]=0.38}, uses=40, maxlevel=1},
},
damage_groups = {fleshy=7},
damage_groups = {fleshy=4},
},
})
minetest.register_tool("nether:sword_white", {
description = "Siwtonic Sword",
inventory_image = "nether_sword_white.png",
wield_image = "nether_sword_white.png^[transformR90",
minetest.register_tool("nether:sword_netherrack_blue", { -- Modif MFF the entire tool
description = "Blue Netherrack Sword",
inventory_image = "nether_sword_netherrack_blue.png",
tool_capabilities = {
full_punch_interval = 0.7,
max_drop_level=1,
groupcaps={
snappy={times={[1]=1.7, [2]=0.8, [3]=0.2}, uses=100, maxlevel=3},
snappy={times={[1]=2.5, [2]=1.1, [3]=0.33}, uses=40, maxlevel=2},
},
damage_groups = {fleshy=11},
damage_groups = {fleshy=6},
},
})
-- override creative hand
if minetest.settings:get_bool("creative_mode") then
local capas = minetest.registered_items[""].tool_capabilities
capas.groupcaps.nether = capas.groupcaps.cracky
minetest.override_item("", {tool_capabilities = capas})
end
minetest.register_tool("nether:sword_white", { -- Modif MFF the entire tool
description = "Siwtonic Sword",
inventory_image = "nether_sword_white.png",
wield_image = "nether_sword_white.png^[transformR90",
tool_capabilities = {
full_punch_interval = 0.6,
max_drop_level=1,
groupcaps={
snappy={times={[1]=1.7, [2]=0.8, [3]=0.2}, uses=100, maxlevel=3},
},
damage_groups = {fleshy=8},
},
})

View File

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

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

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

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

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

View File

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

View File

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

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Before

Width:  |  Height:  |  Size: 198 B

After

Width:  |  Height:  |  Size: 198 B

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

Before

Width:  |  Height:  |  Size: 220 B

After

Width:  |  Height:  |  Size: 220 B

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

Before

Width:  |  Height:  |  Size: 289 B

After

Width:  |  Height:  |  Size: 289 B

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

Before

Width:  |  Height:  |  Size: 440 B

After

Width:  |  Height:  |  Size: 440 B

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

Before

Width:  |  Height:  |  Size: 448 B

After

Width:  |  Height:  |  Size: 448 B

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

Before

Width:  |  Height:  |  Size: 541 B

After

Width:  |  Height:  |  Size: 541 B

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

Before

Width:  |  Height:  |  Size: 474 B

After

Width:  |  Height:  |  Size: 474 B

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

Before

Width:  |  Height:  |  Size: 303 B

After

Width:  |  Height:  |  Size: 303 B

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

Before

Width:  |  Height:  |  Size: 726 B

After

Width:  |  Height:  |  Size: 726 B

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

Before

Width:  |  Height:  |  Size: 478 B

After

Width:  |  Height:  |  Size: 478 B

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

Before

Width:  |  Height:  |  Size: 493 B

After

Width:  |  Height:  |  Size: 493 B

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

Before

Width:  |  Height:  |  Size: 401 B

After

Width:  |  Height:  |  Size: 401 B

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

Before

Width:  |  Height:  |  Size: 446 B

After

Width:  |  Height:  |  Size: 446 B

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

Before

Width:  |  Height:  |  Size: 607 B

After

Width:  |  Height:  |  Size: 607 B

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

Before

Width:  |  Height:  |  Size: 532 B

After

Width:  |  Height:  |  Size: 532 B

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

Before

Width:  |  Height:  |  Size: 442 B

After

Width:  |  Height:  |  Size: 442 B

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

Before

Width:  |  Height:  |  Size: 764 B

After

Width:  |  Height:  |  Size: 764 B

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

Before

Width:  |  Height:  |  Size: 544 B

After

Width:  |  Height:  |  Size: 544 B

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

Before

Width:  |  Height:  |  Size: 463 B

After

Width:  |  Height:  |  Size: 463 B

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

Before

Width:  |  Height:  |  Size: 709 B

After

Width:  |  Height:  |  Size: 709 B

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

Before

Width:  |  Height:  |  Size: 471 B

After

Width:  |  Height:  |  Size: 471 B

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

Before

Width:  |  Height:  |  Size: 673 B

After

Width:  |  Height:  |  Size: 673 B

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

Before

Width:  |  Height:  |  Size: 449 B

After

Width:  |  Height:  |  Size: 449 B

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

Before

Width:  |  Height:  |  Size: 699 B

After

Width:  |  Height:  |  Size: 699 B

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

Before

Width:  |  Height:  |  Size: 481 B

After

Width:  |  Height:  |  Size: 481 B

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

Before

Width:  |  Height:  |  Size: 807 B

After

Width:  |  Height:  |  Size: 807 B

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

Before

Width:  |  Height:  |  Size: 669 B

After

Width:  |  Height:  |  Size: 669 B

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

Before

Width:  |  Height:  |  Size: 670 B

After

Width:  |  Height:  |  Size: 670 B

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

Before

Width:  |  Height:  |  Size: 528 B

After

Width:  |  Height:  |  Size: 528 B

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

Before

Width:  |  Height:  |  Size: 222 B

After

Width:  |  Height:  |  Size: 222 B

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

Before

Width:  |  Height:  |  Size: 488 B

After

Width:  |  Height:  |  Size: 488 B

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

Before

Width:  |  Height:  |  Size: 775 B

After

Width:  |  Height:  |  Size: 775 B

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

Before

Width:  |  Height:  |  Size: 550 B

After

Width:  |  Height:  |  Size: 550 B

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

Before

Width:  |  Height:  |  Size: 244 B

After

Width:  |  Height:  |  Size: 244 B

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

Before

Width:  |  Height:  |  Size: 211 B

After

Width:  |  Height:  |  Size: 211 B

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

Before

Width:  |  Height:  |  Size: 359 B

After

Width:  |  Height:  |  Size: 359 B

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

Before

Width:  |  Height:  |  Size: 519 B

After

Width:  |  Height:  |  Size: 519 B

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

Before

Width:  |  Height:  |  Size: 529 B

After

Width:  |  Height:  |  Size: 529 B

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

Before

Width:  |  Height:  |  Size: 214 B

After

Width:  |  Height:  |  Size: 214 B

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

Before

Width:  |  Height:  |  Size: 516 B

After

Width:  |  Height:  |  Size: 516 B

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

Before

Width:  |  Height:  |  Size: 184 B

After

Width:  |  Height:  |  Size: 184 B

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

Before

Width:  |  Height:  |  Size: 352 B

After

Width:  |  Height:  |  Size: 352 B

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

Before

Width:  |  Height:  |  Size: 218 B

After

Width:  |  Height:  |  Size: 218 B

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

Before

Width:  |  Height:  |  Size: 232 B

After

Width:  |  Height:  |  Size: 232 B

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

Before

Width:  |  Height:  |  Size: 186 B

After

Width:  |  Height:  |  Size: 186 B

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

Before

Width:  |  Height:  |  Size: 280 B

After

Width:  |  Height:  |  Size: 280 B

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

Before

Width:  |  Height:  |  Size: 427 B

After

Width:  |  Height:  |  Size: 427 B

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

Before

Width:  |  Height:  |  Size: 603 B

After

Width:  |  Height:  |  Size: 603 B

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

Before

Width:  |  Height:  |  Size: 582 B

After

Width:  |  Height:  |  Size: 582 B

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

Before

Width:  |  Height:  |  Size: 490 B

After

Width:  |  Height:  |  Size: 490 B

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

Before

Width:  |  Height:  |  Size: 831 B

After

Width:  |  Height:  |  Size: 831 B

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

Before

Width:  |  Height:  |  Size: 693 B

After

Width:  |  Height:  |  Size: 693 B

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

Before

Width:  |  Height:  |  Size: 682 B

After

Width:  |  Height:  |  Size: 682 B

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

Before

Width:  |  Height:  |  Size: 547 B

After

Width:  |  Height:  |  Size: 547 B

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

Before

Width:  |  Height:  |  Size: 726 B

After

Width:  |  Height:  |  Size: 726 B

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

Before

Width:  |  Height:  |  Size: 533 B

After

Width:  |  Height:  |  Size: 533 B

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

Before

Width:  |  Height:  |  Size: 397 B

After

Width:  |  Height:  |  Size: 397 B

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

Before

Width:  |  Height:  |  Size: 491 B

After

Width:  |  Height:  |  Size: 491 B

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

Before

Width:  |  Height:  |  Size: 724 B

After

Width:  |  Height:  |  Size: 724 B

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

Before

Width:  |  Height:  |  Size: 521 B

After

Width:  |  Height:  |  Size: 521 B

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

Before

Width:  |  Height:  |  Size: 216 B

After

Width:  |  Height:  |  Size: 216 B

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

Before

Width:  |  Height:  |  Size: 375 B

After

Width:  |  Height:  |  Size: 375 B

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