nether/init.lua

459 lines
11 KiB
Lua
Raw Permalink Normal View History

2017-12-19 21:03:58 -08:00
--[[
Nether mod for minetest
Copyright (C) 2013 PilzAdam
Permission to use, copy, modify, and/or distribute this software for
any purpose with or without fee is hereby granted, provided that the
above copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR
BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
]]--
2016-05-24 23:59:47 -07:00
-- Functions
2013-04-29 11:33:09 -07:00
local function build_portal(pos, target)
2016-05-24 23:59:47 -07:00
local p1 = {x = pos.x - 1, y = pos.y - 1, z = pos.z}
local p2 = {x = p1.x + 3, y = p1.y + 4, z = p1.z}
local path = minetest.get_modpath("nether") .. "/schematics/nether_portal.mts"
minetest.place_schematic({x = p1.x, y = p1.y, z = p1.z - 2}, path, 0, nil, true)
2016-05-24 23:59:47 -07:00
for y = p1.y, p2.y do
for x = p1.x, p2.x do
local meta = minetest.get_meta({x = x, y = y, z = p1.z})
2013-04-29 11:33:09 -07:00
meta:set_string("p1", minetest.pos_to_string(p1))
meta:set_string("p2", minetest.pos_to_string(p2))
meta:set_string("target", minetest.pos_to_string(target))
end
end
end
2016-05-24 23:59:47 -07:00
2013-04-29 11:33:09 -07:00
local function move_check(p1, max, dir)
2016-05-24 23:59:47 -07:00
local p = {x = p1.x, y = p1.y, z = p1.z}
local d = math.abs(max - p1[dir]) / (max - p1[dir])
2013-04-29 11:33:09 -07:00
while p[dir] ~= max do
p[dir] = p[dir] + d
2016-04-16 20:11:25 -07:00
if minetest.get_node(p).name ~= "default:obsidian" then
2013-04-29 11:33:09 -07:00
return false
end
end
2016-05-24 23:59:47 -07:00
2013-04-29 11:33:09 -07:00
return true
end
2013-04-29 11:33:09 -07:00
local function check_portal(p1, p2)
if p1.x ~= p2.x then
if not move_check(p1, p2.x, "x") then
return false
end
if not move_check(p2, p1.x, "x") then
return false
end
elseif p1.z ~= p2.z then
if not move_check(p1, p2.z, "z") then
return false
end
if not move_check(p2, p1.z, "z") then
return false
end
else
return false
end
2013-04-29 11:33:09 -07:00
if not move_check(p1, p2.y, "y") then
return false
end
if not move_check(p2, p1.y, "y") then
return false
end
2013-04-29 11:33:09 -07:00
return true
end
2013-04-29 11:33:09 -07:00
local function is_portal(pos)
2016-05-24 23:59:47 -07:00
for d = -3, 3 do
for y = -4, 4 do
local px = {x = pos.x + d, y = pos.y + y, z = pos.z}
local pz = {x = pos.x, y = pos.y + y, z = pos.z + d}
if check_portal(px, {x = px.x + 3, y = px.y + 4, z = px.z}) then
return px, {x = px.x + 3, y = px.y + 4, z = px.z}
2013-04-29 11:33:09 -07:00
end
2016-05-24 23:59:47 -07:00
if check_portal(pz, {x = pz.x, y = pz.y + 4, z = pz.z + 3}) then
return pz, {x = pz.x, y = pz.y + 4, z = pz.z + 3}
2013-04-29 11:33:09 -07:00
end
end
end
end
2013-04-29 11:33:09 -07:00
local function make_portal(pos)
local p1, p2 = is_portal(pos)
if not p1 or not p2 then
return false
end
2016-05-24 23:59:47 -07:00
for d = 1, 2 do
for y = p1.y + 1, p2.y - 1 do
2013-04-29 11:33:09 -07:00
local p
if p1.z == p2.z then
2016-05-24 23:59:47 -07:00
p = {x = p1.x + d, y = y, z = p1.z}
2013-04-29 11:33:09 -07:00
else
2016-05-24 23:59:47 -07:00
p = {x = p1.x, y = y, z = p1.z + d}
2013-04-29 11:33:09 -07:00
end
2016-04-16 20:11:25 -07:00
if minetest.get_node(p).name ~= "air" then
2013-04-29 11:33:09 -07:00
return false
end
end
end
2013-04-29 11:33:09 -07:00
local param2
2016-05-24 23:59:47 -07:00
if p1.z == p2.z then
param2 = 0
else
param2 = 1
end
2016-05-24 23:59:47 -07:00
local target = {x = p1.x, y = p1.y, z = p1.z}
-- don't find nether, since nether-blocks not nether mod
2016-05-24 23:59:47 -07:00
for d = 0, 3 do
for y = p1.y, p2.y do
2017-12-19 21:31:53 -08:00
local p
2016-05-24 23:59:47 -07:00
if param2 == 0 then
p = {x = p1.x + d, y = y, z = p1.z}
else
p = {x = p1.x, y = y, z = p1.z + d}
end
2016-04-16 20:11:25 -07:00
if minetest.get_node(p).name == "air" then
2016-05-24 23:59:47 -07:00
minetest.set_node(p, {name = "nether:portal", param2 = param2})
2013-04-29 11:33:09 -07:00
end
2016-04-16 20:11:25 -07:00
local meta = minetest.get_meta(p)
2013-04-29 11:33:09 -07:00
meta:set_string("p1", minetest.pos_to_string(p1))
meta:set_string("p2", minetest.pos_to_string(p2))
meta:set_string("target", minetest.pos_to_string(target))
end
end
2016-05-24 23:59:47 -07:00
2013-04-29 11:33:09 -07:00
return true
end
2016-05-24 23:59:47 -07:00
-- ABMs
minetest.register_abm({
nodenames = {"nether:portal"},
interval = 1,
chance = 2,
action = function(pos, node)
2017-12-19 21:35:05 -08:00
minetest.add_particlespawner({
2016-05-24 23:59:47 -07:00
32, --amount
4, --time
{x = pos.x - 0.25, y = pos.y - 0.25, z = pos.z - 0.25}, --minpos
{x = pos.x + 0.25, y = pos.y + 0.25, z = pos.z + 0.25}, --maxpos
{x = -0.8, y = -0.8, z = -0.8}, --minvel
{x = 0.8, y = 0.8, z = 0.8}, --maxvel
{x = 0, y = 0, z = 0}, --minacc
{x = 0, y = 0, z = 0}, --maxacc
0.5, --minexptime
1, --maxexptime
1, --minsize
2, --maxsize
false, --collisiondetection
"nether_particle.png" --texture
2017-12-19 21:35:05 -08:00
})
2016-05-24 23:59:47 -07:00
end,
})
-- Nodes
minetest.register_node("nether:portal", {
description = "Nether Portal",
tiles = {
"nether_transparent.png",
"nether_transparent.png",
"nether_transparent.png",
"nether_transparent.png",
{
name = "nether_portal.png",
animation = {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 0.5,
},
},
{
name = "nether_portal.png",
animation = {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 0.5,
},
},
},
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
use_texture_alpha = true,
walkable = false,
diggable = false,
pointable = false,
buildable_to = false,
is_ground_content = false,
2016-05-24 23:59:47 -07:00
drop = "",
light_source = 5,
post_effect_color = {a = 180, r = 128, g = 0, b = 128},
alpha = 192,
node_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.1, 0.5, 0.5, 0.1},
},
},
groups = {not_in_creative_inventory = 1}
})
2013-04-29 11:33:09 -07:00
minetest.register_node(":default:obsidian", {
description = "Obsidian",
tiles = {"default_obsidian.png"},
is_ground_content = false,
2013-04-29 11:33:09 -07:00
sounds = default.node_sound_stone_defaults(),
2016-05-24 23:59:47 -07:00
groups = {cracky = 1, level = 2},
2013-04-29 11:33:09 -07:00
on_destruct = function(pos)
2016-04-16 20:11:25 -07:00
local meta = minetest.get_meta(pos)
2013-04-29 11:33:09 -07:00
local p1 = minetest.string_to_pos(meta:get_string("p1"))
local p2 = minetest.string_to_pos(meta:get_string("p2"))
local target = minetest.string_to_pos(meta:get_string("target"))
if not p1 or not p2 then
return
end
2016-05-24 23:59:47 -07:00
for x = p1.x, p2.x do
for y = p1.y, p2.y do
for z = p1.z, p2.z do
local nn = minetest.get_node({x = x, y = y, z = z}).name
2013-04-29 11:33:09 -07:00
if nn == "default:obsidian" or nn == "nether:portal" then
if nn == "nether:portal" then
2016-05-24 23:59:47 -07:00
minetest.remove_node({x = x, y = y, z = z})
2013-04-29 11:33:09 -07:00
end
2016-05-24 23:59:47 -07:00
local m = minetest.get_meta({x = x, y = y, z = z})
2013-04-29 11:33:09 -07:00
m:set_string("p1", "")
m:set_string("p2", "")
m:set_string("target", "")
end
end
end
end
2016-05-24 23:59:47 -07:00
2016-04-16 20:11:25 -07:00
meta = minetest.get_meta(target)
2013-04-29 11:33:09 -07:00
if not meta then
return
end
p1 = minetest.string_to_pos(meta:get_string("p1"))
p2 = minetest.string_to_pos(meta:get_string("p2"))
if not p1 or not p2 then
return
end
2016-05-24 23:59:47 -07:00
for x = p1.x, p2.x do
for y = p1.y, p2.y do
for z = p1.z, p2.z do
local nn = minetest.get_node({x = x, y = y, z = z}).name
2013-04-29 11:33:09 -07:00
if nn == "default:obsidian" or nn == "nether:portal" then
if nn == "nether:portal" then
2016-05-24 23:59:47 -07:00
minetest.remove_node({x = x, y = y, z = z})
2013-04-29 11:33:09 -07:00
end
2016-05-24 23:59:47 -07:00
local m = minetest.get_meta({x = x, y = y, z = z})
2013-04-29 11:33:09 -07:00
m:set_string("p1", "")
m:set_string("p2", "")
m:set_string("target", "")
end
end
end
end
end,
})
minetest.register_node("nether:rack", {
2013-04-29 11:33:09 -07:00
description = "Netherrack",
tiles = {"nether_rack.png"},
2013-04-29 11:33:09 -07:00
is_ground_content = true,
2016-05-24 23:59:47 -07:00
groups = {cracky = 3, level = 2},
2013-04-29 11:33:09 -07:00
sounds = default.node_sound_stone_defaults(),
})
minetest.register_node("nether:sand", {
2013-04-29 11:33:09 -07:00
description = "Nethersand",
tiles = {"nether_sand.png"},
2013-04-29 11:33:09 -07:00
is_ground_content = true,
2016-05-24 23:59:47 -07:00
groups = {crumbly = 3, level = 2, falling_node = 1},
sounds = default.node_sound_gravel_defaults({
2016-05-24 23:59:47 -07:00
footstep = {name = "default_gravel_footstep", gain = 0.45},
2013-04-29 11:33:09 -07:00
}),
})
minetest.register_node("nether:glowstone", {
description = "Glowstone",
tiles = {"nether_glowstone.png"},
is_ground_content = true,
light_source = 14,
paramtype = "light",
2016-05-24 23:59:47 -07:00
groups = {cracky = 3, oddly_breakable_by_hand = 3},
2013-04-29 11:33:09 -07:00
sounds = default.node_sound_glass_defaults(),
})
minetest.register_node("nether:brick", {
description = "Nether Brick",
tiles = {"nether_brick.png"},
is_ground_content = false,
2016-05-24 23:59:47 -07:00
groups = {cracky = 2, level = 2},
sounds = default.node_sound_stone_defaults(),
})
2015-11-22 23:08:46 -08:00
local fence_texture =
"default_fence_overlay.png^nether_brick.png^default_fence_overlay.png^[makealpha:255,126,126"
2016-05-24 23:59:47 -07:00
2015-11-22 23:08:46 -08:00
minetest.register_node("nether:fence_nether_brick", {
description = "Nether Brick Fence",
drawtype = "fencelike",
tiles = {"nether_brick.png"},
inventory_image = fence_texture,
wield_image = fence_texture,
paramtype = "light",
sunlight_propagates = true,
is_ground_content = false,
selection_box = {
type = "fixed",
fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7},
},
groups = {cracky = 2, level = 2},
2015-11-22 23:08:46 -08:00
sounds = default.node_sound_stone_defaults(),
})
2016-05-24 23:59:47 -07:00
-- Register stair and slab
stairs.register_stair_and_slab(
"nether_brick",
"nether:brick",
{cracky = 2, level = 2},
2016-05-24 23:59:47 -07:00
{"nether_brick.png"},
"nether stair",
"nether slab",
default.node_sound_stone_defaults()
)
-- StairsPlus
if minetest.get_modpath("moreblocks") then
stairsplus:register_all(
"nether", "brick", "nether:brick", {
description = "Nether Brick",
groups = {cracky = 2, level = 2},
tiles = {"nether_brick.png"},
sounds = default.node_sound_stone_defaults(),
})
end
2016-05-24 23:59:47 -07:00
stairs.register_stair_and_slab("brick", "nether:brick",
{cracky=3, oddly_breakable_by_hand=1},
{"nether_brick.png"},
"nether stair",
"nether slab",
2017-12-19 21:17:14 -08:00
default.node_sound_stone_defaults())
2016-05-24 23:59:47 -07:00
-- Craftitems
2017-12-20 20:52:57 -08:00
minetest.override_item("default:mese_crystal_fragment", {
2016-05-24 23:59:47 -07:00
on_place = function(stack, _, pt)
if pt.under and minetest.get_node(pt.under).name == "default:obsidian" then
local done = make_portal(pt.under)
if done and not minetest.settings:get_bool("creative_mode") then
2016-05-24 23:59:47 -07:00
stack:take_item()
end
end
return stack
end,
})
-- Crafting
minetest.register_craft({
output = "nether:brick 4",
recipe = {
{"nether:rack", "nether:rack"},
{"nether:rack", "nether:rack"},
}
})
minetest.register_craft({
output = "nether:fence_nether_brick 6",
recipe = {
{"nether:brick", "nether:brick", "nether:brick"},
{"nether:brick", "nether:brick", "nether:brick"},
},
})
-- Mapgen
-- Initialize noise object, localise noise and data buffers
local nobj_cave = nil
2017-12-19 21:31:53 -08:00
local nbuf_cave = nil
local dbuf = nil
-- Content ids
local c_air = minetest.get_content_id("air")
2017-12-19 21:31:53 -08:00
--local c_stone_with_coal = minetest.get_content_id("default:stone_with_coal")
--local c_stone_with_iron = minetest.get_content_id("default:stone_with_iron")
local c_stone_with_mese = minetest.get_content_id("default:stone_with_mese")
local c_stone_with_diamond = minetest.get_content_id("default:stone_with_diamond")
local c_stone_with_gold = minetest.get_content_id("default:stone_with_gold")
2017-12-19 21:31:53 -08:00
--local c_stone_with_copper = minetest.get_content_id("default:stone_with_copper")
local c_mese = minetest.get_content_id("default:mese")
local c_gravel = minetest.get_content_id("default:gravel")
local c_dirt = minetest.get_content_id("default:dirt")
local c_sand = minetest.get_content_id("default:sand")
local c_cobble = minetest.get_content_id("default:cobble")
local c_mossycobble = minetest.get_content_id("default:mossycobble")
local c_stair_cobble = minetest.get_content_id("stairs:stair_cobble")
local c_lava_source = minetest.get_content_id("default:lava_source")
local c_lava_flowing = minetest.get_content_id("default:lava_flowing")
local c_water_source = minetest.get_content_id("default:water_source")
local c_water_flowing = minetest.get_content_id("default:water_flowing")
local c_glowstone = minetest.get_content_id("nether:glowstone")
local c_nethersand = minetest.get_content_id("nether:sand")
local c_netherbrick = minetest.get_content_id("nether:brick")
local c_netherrack = minetest.get_content_id("nether:rack")