229 lines
7.1 KiB
Lua
229 lines
7.1 KiB
Lua
minetest.register_privilege("dimensions", {
|
|
description = "Can use dimensions teleport tool",
|
|
give_to_singleplayer= false,
|
|
})
|
|
|
|
multidimensions.clear_dimensions=function()
|
|
multidimensions.registered_dimensions = {}
|
|
end
|
|
|
|
minetest.register_alias("dim", "multidimensions:teleporttool")
|
|
|
|
multidimensions.setrespawn=function(object,pos)
|
|
if not object:is_player() then return false end
|
|
local name=object:get_player_name()
|
|
if minetest.check_player_privs(name, {dimensions=true}) then return false end
|
|
if multidimensions.remake_bed and minetest.get_modpath("beds")~=nil then
|
|
beds.spawn[name]=pos
|
|
beds.save_spawns()
|
|
end
|
|
if multidimensions.remake_home and minetest.get_modpath("sethome")~=nil then
|
|
sethome.set(name, pos)
|
|
end
|
|
end
|
|
|
|
multidimensions.form=function(player,object)
|
|
local name=player:get_player_name()
|
|
local info=""
|
|
multidimensions.user[name]={}
|
|
multidimensions.user[name].pos=object:get_pos()
|
|
multidimensions.user[name].object=object
|
|
if object:is_player() and object:get_player_name()==name then
|
|
info="Teleport you"
|
|
elseif object:is_player() and object:get_player_name()~=name then
|
|
info="Teleport "..object:get_player_name()
|
|
else
|
|
info="Teleport object"
|
|
end
|
|
local list = "earth"
|
|
local d = {"earth"}
|
|
for i, but in pairs(multidimensions.registered_dimensions) do
|
|
list = list .. ","..i
|
|
table.insert(d,i)
|
|
end
|
|
multidimensions.user[name].dims = d
|
|
local gui="size[3.5,5.5]"..
|
|
"label[0,-0.2;" .. info .."]"..
|
|
"textlist[0,0.5;3,5;list;" .. list .."]"
|
|
minetest.after(0.1, function(gui)
|
|
return minetest.show_formspec(player:get_player_name(), "multidimensions.form",gui)
|
|
end, gui)
|
|
end
|
|
|
|
minetest.register_on_player_receive_fields(function(player, form, pressed)
|
|
if form=="multidimensions.form" then
|
|
local name=player:get_player_name()
|
|
if pressed.quit then
|
|
multidimensions.user[name]=nil
|
|
return
|
|
end
|
|
local pos=multidimensions.user[name].pos
|
|
local object=multidimensions.user[name].object
|
|
local dims = multidimensions.user[name].dims
|
|
local dim = pressed.list and tonumber(pressed.list:sub(5,-1)) or 0
|
|
local pos=object:get_pos()
|
|
local d = multidimensions.registered_dimensions[dims[dim]]
|
|
if not d then
|
|
multidimensions.move(object,{x=pos.x,y=0,z=pos.z})
|
|
if object:is_player() then
|
|
multidimensions.apply_dimension(object)
|
|
end
|
|
else
|
|
local pos2={x=pos.x,y=d.dirt_start+d.dirt_depth+1,z=pos.z}
|
|
if d and minetest.is_protected(pos2, name)==false then
|
|
multidimensions.move(object,pos2)
|
|
if object:is_player() then
|
|
multidimensions.apply_dimension(object)
|
|
end
|
|
end
|
|
end
|
|
multidimensions.user[name]=nil
|
|
minetest.close_formspec(name,"multidimensions.form")
|
|
end
|
|
end)
|
|
|
|
minetest.register_tool("multidimensions:teleporttool", {
|
|
description = "Dimensions teleport tool",
|
|
inventory_image = "default_stick.png^[colorize:#e9ff00ff",
|
|
on_use = function(itemstack, user, pointed_thing)
|
|
local pos=user:get_pos()
|
|
local name=user:get_player_name()
|
|
|
|
if minetest.check_player_privs(name, {dimensions=true})==false then
|
|
itemstack:replace(nil)
|
|
minetest.chat_send_player(name,"You need the dimensions privilege to use this tool")
|
|
return itemstack
|
|
end
|
|
|
|
local object={}
|
|
if pointed_thing.type=="object" then
|
|
object=pointed_thing.ref
|
|
else
|
|
object=user
|
|
end
|
|
multidimensions.form(user,object)
|
|
return itemstack
|
|
end
|
|
})
|
|
|
|
minetest.register_on_respawnplayer(function(player)
|
|
multidimensions.apply_dimension(player)
|
|
end)
|
|
minetest.register_on_joinplayer(function(player)
|
|
multidimensions.apply_dimension(player)
|
|
end)
|
|
minetest.register_on_leaveplayer(function(player)
|
|
multidimensions.player_pos[player:get_player_name()] = nil
|
|
end)
|
|
|
|
multidimensions.apply_dimension=function(player)
|
|
local p = player:get_pos()
|
|
local name = player:get_player_name()
|
|
local pp = multidimensions.player_pos[name]
|
|
if pp and p.y > pp.y1 and p.y < pp.y2 then
|
|
return
|
|
elseif pp then
|
|
local od = multidimensions.registered_dimensions[pp.name]
|
|
if od and od.on_leave then
|
|
od.on_leave(player)
|
|
end
|
|
end
|
|
for i, v in pairs(multidimensions.registered_dimensions) do
|
|
if p.y > v.dim_y and p.y < v.dim_y+v.dim_height then
|
|
multidimensions.player_pos[name] = {y1 = v.dim_y, y2 = v.dim_y+v.dim_height, name=i}
|
|
player:set_physics_override({gravity=v.gravity})
|
|
if v.sky then
|
|
player:set_sky(v.sky[1],v.sky[2],v.sky[3])
|
|
else
|
|
player:set_sky(nil,"regular",nil)
|
|
end
|
|
if v.on_enter then
|
|
v.on_enter(player)
|
|
end
|
|
return
|
|
end
|
|
end
|
|
player:set_physics_override({gravity=1})
|
|
player:set_sky(nil,"regular",nil)
|
|
multidimensions.player_pos[name] = {
|
|
y1 = multidimensions.earth.under,
|
|
y2 = multidimensions.earth.above,
|
|
name=""
|
|
}
|
|
end
|
|
|
|
multidimensions.move=function(object,pos,set_re)
|
|
local move=false
|
|
object:set_pos(pos)
|
|
multidimensions.setrespawn(object,pos)
|
|
|
|
if set_re == nil then
|
|
return
|
|
end
|
|
|
|
minetest.set_node({x=pos.x,y=pos.y-2,z=pos.z},{name="default:cobble"})
|
|
minetest.after(1, function(pos,object,move,set_re)
|
|
for i=1,100,1 do
|
|
local nname=minetest.get_node(pos).name
|
|
if nname~="air" and nname~="ignore" and nname ~= "multidimensions:teleporterre" then
|
|
pos.y=pos.y+1
|
|
move=true
|
|
elseif move then
|
|
minetest.set_node(pos,{name="multidimensions:teleporterre"})
|
|
minetest.get_meta(pos):set_string("pos",minetest.pos_to_string({x=set_re.x,y=set_re.y+1,z=set_re.z}))
|
|
pos.y = pos.y + 1
|
|
minetest.get_meta(set_re):set_string("pos",minetest.pos_to_string(pos))
|
|
object:set_pos({x=pos.x,y=pos.y+1,z=pos.z})
|
|
multidimensions.setrespawn(object,{x=pos.x,y=pos.y+1,z=pos.z})
|
|
return
|
|
end
|
|
end
|
|
pos.y = pos.y - 2
|
|
local reg = minetest.registered_nodes[minetest.get_node(pos).name]
|
|
if reg == nil or reg.walkable == false or reg.name == "default:cobble" then
|
|
for x = -2,2,1 do
|
|
for z = -2,2,1 do
|
|
minetest.set_node({x=pos.x+x,y=pos.y,z=pos.z+z},{name="default:cobble"})
|
|
end
|
|
end
|
|
end
|
|
end, pos,object,move,set_re)
|
|
minetest.after(5, function(pos,object,move,set_re)
|
|
for i=1,100,1 do
|
|
local nname=minetest.get_node(pos).name
|
|
if nname~="air" and nname~="ignore" and nname ~= "multidimensions:teleporterre" then
|
|
pos.y=pos.y+1
|
|
move=true
|
|
elseif move then
|
|
minetest.set_node(pos,{name="multidimensions:teleporterre"})
|
|
minetest.get_meta(pos):set_string("pos",minetest.pos_to_string({x=set_re.x,y=set_re.y+1,z=set_re.z}))
|
|
pos.y = pos.y + 1
|
|
minetest.get_meta(set_re):set_string("pos",minetest.pos_to_string(pos))
|
|
object:set_pos({x=pos.x,y=pos.y+1,z=pos.z})
|
|
multidimensions.setrespawn(object,{x=pos.x,y=pos.y+1,z=pos.z})
|
|
return
|
|
end
|
|
end
|
|
pos.y = pos.y - 2
|
|
local reg = minetest.registered_nodes[minetest.get_node(pos).name]
|
|
if reg == nil or reg.walkable == false or reg.name == "default:cobble" then
|
|
for x = -2,2,1 do
|
|
for z = -2,2,1 do
|
|
minetest.set_node({x=pos.x+x,y=pos.y,z=pos.z+z},{name="default:cobble"})
|
|
end
|
|
end
|
|
end
|
|
end, pos,object,move,set_re)
|
|
return true
|
|
end
|
|
|
|
local capg = 0
|
|
minetest.register_globalstep(function(dtime)
|
|
capg=capg+dtime
|
|
if capg > 2 then
|
|
capg=0
|
|
for _, player in pairs(minetest.get_connected_players()) do
|
|
multidimensions.apply_dimension(player)
|
|
end
|
|
end
|
|
end) |