myadmin/underworld.lua

197 lines
5.2 KiB
Lua

--[[
check for stone when placing underworld?
set underworld teleporter and set meta
make a schematic for underworld
make lvm for schematic placement
decide if this should be a seperate mod
--]]
local tp = {}
minetest.register_node("myadmin:underworld", {
description = "Underworld",
tiles = {
"default_sand.png^[colorize:#000000:255"
},
drawtype = "nodebox",
paramtype = "light",
groups = {oddly_breakable_by_hand = 1, not_in_creative_inventory = 1},
node_box = {
type = "fixed",
fixed = {
{-0.5625, -0.5, 0.4375, -0.4375, 1.5, 0.5625},
{0.4375, -0.5, 0.4375, 0.5625, 1.5, 0.5625},
{0.4375, -0.5, -0.5625, 0.5625, 1.5, -0.4375},
{-0.5625, -0.5, -0.5625, -0.4375, 1.5, -0.4375},
{-0.5625, -0.5, -0.5625, 0.5625, -0.4375, 0.5625},
{-0.5625, 1.4375, -0.5625, 0.5625, 1.5, 0.5625},
}
},
selection_box = {
type = "fixed",
fixed = {
{-0.5625, -0.5, 0.4375, -0.4375, 1.5, 0.5625},
{0.4375, -0.5, 0.4375, 0.5625, 1.5, 0.5625},
{0.4375, -0.5, -0.5625, 0.5625, 1.5, -0.4375},
{-0.5625, -0.5, -0.5625, -0.4375, 1.5, -0.4375},
{-0.5625, -0.5, -0.5625, 0.5625, -0.4375, 0.5625},
{-0.5625, 1.4375, -0.5625, 0.5625, 1.5, 0.5625},
}
},
on_place = function(itemstack, placer, pointed_thing)
if minetest.get_player_privs(placer:get_player_name()).myadmin_levels_super == true then
local pos = pointed_thing.above
local top = { x = pos.x, y = pos.y + 1, z = pos.z }
if top.name ~= air then
minetest.chat_send_player(placer, "Not enough room!")
return
end
minetest.set_node(pos, {name = "myadmin:underworld"})
minetest.set_node(top, {name = "myadmin:underworld_block"})
minetest.show_formspec(placer:get_player_name(),"fs",
"size[6,5;]"..
"field[1,1;4.5,1;name;Name;]"..
"field[2,2.5;2,1;depth;Depth;]"..
"button_exit[2,4;2,1;set;set]")
minetest.register_on_player_receive_fields(function(player, fs, fields)
local meta = minetest.get_meta(pos)
local n = fields["name"]
local d = fields["depth"]
if tonumber(d) + pos.y > 15000 then
d = 15000 + pos.y
end
if tonumber(d) + pos.y < 3000 then
d = 3000 + pos.y
end
if d == "" or
d == nil then
d = 5000
end
if fields["name"] or
fields["depth"] or
fields["set"] then
if fields["name"] ~= "" and
fields["depth"] ~= "" then
meta:set_string("name",n)
meta:set_string("infotext",n.." Top at "..d)
meta:set_string("depth",d)
meta:set_string("torb","top")
minetest.forceload_block({x = pos.x, y = pos.y - tonumber(d), z = pos.z})
minetest.set_node({x = pos.x, y = pos.y - tonumber(d), z = pos.z}, {name = "myadmin:underworld"})
minetest.set_node({x = pos.x, y = pos.y - tonumber(d) + 1, z = pos.z}, {name = "myadmin:underworld_block"})
local dmeta = minetest.get_meta({x = pos.x, y = pos.y - tonumber(d), z = pos.z})
dmeta:set_string("name",n.." Underworld")
dmeta:set_string("infotext",n.." Underworld at "..d)
dmeta:set_string("depth",d)
dmeta:set_string("torb","bottom")
end
end
end)
end
end,
on_dig = function(pos, node, player)
if minetest.get_player_privs(player:get_player_name()).myadmin_levels_super == true then
local meta = minetest.get_meta(pos)
local n = meta:get_string("torb")
local below = tonumber(meta:get_string("depth"))
--if below == nil then below = 1 end
local b = { x = pos.x, y = pos.y - below, z = pos.z }
local btop = { x = pos.x, y = pos.y - (below - 1), z = pos.z }
local t = { x = pos.x, y = pos.y + below, z = pos.z }
local ttop = { x = pos.x, y = pos.y + (below + 1), z = pos.z }
local top = { x = pos.x, y = pos.y + 1, z = pos.z }
if n == "top" then
minetest.remove_node(pos)
minetest.remove_node(top)
minetest.remove_node(b)
minetest.remove_node(btop)
elseif n == "bottom" then
minetest.remove_node(pos)
minetest.remove_node(top)
minetest.remove_node(t)
minetest.remove_node(ttop)
end
end
end,
})
minetest.register_node("myadmin:underworld_block", {
tiles = {
{name="myadmin_underworld_ani_blue.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.5}}
},
drawtype = "nodebox",
paramtype = "light",
walkable = false,
pointable = false,
light_source = 12,
node_box = {
type = "fixed",
fixed = {
{-0.4375, -1.4375, -0.4375, 0.4375, 0.4375, 0.4375},
}
}
})
minetest.register_abm({
nodenames = {"myadmin:underworld"},
interval = 1,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
local meta = minetest.get_meta(pos)
local t = meta:get_string("name")
local depth = tonumber(meta:get_string("depth"))
if depth == nil then return end
local up = meta:get_string("torb")
local objs = minetest.env:get_objects_inside_radius(pos, 1)
for k, player in pairs(objs) do
local p = player:get_player_name()
if tp[p] == false then
return
end
tp[p] = true
if up == "top" and p then
tp[p] = false
player:setpos({x = pos.x, y = pos.y - depth, z = pos.z})
minetest.after(10, function()
tp[p] = true
end)
else
tp[p] = false
player:setpos({x = pos.x, y = pos.y + depth, z = pos.z})
minetest.after(10, function()
tp[p] = true
end)
end
end
end
})