I have been wondering for a time how i could do a little dimension simulation test, this seems to work fine, but i do not have any desire to work on it
it's simply about copying and pasting blocks & objects.
Spoiler
Code: Select all
dimlayer = {}
minetest.register_tool("mod:dimlayer", {
description = "Dim layer",
inventory_image = "default_stick.png",
on_place=function(itemstack, user, pointed_thing)
local name = user:get_player_name()
dimlayer[name] = nil
end,
on_use=function(itemstack, user, pointed_thing)
local name = user:get_player_name()
dimlayer[name] = dimlayer[name] or {layer1={nodes={},objects={}},layer2={nodes={},objects={}},layer=0}
local p = dimlayer[name]
local pos = user:get_pos()
local a = 7
if p.layer == 0 then
p.pos = pos
p.layer = 1
end
local l = p["layer"..p.layer]
for x=p.pos.x-a,p.pos.x+a do
for y=p.pos.y-a,p.pos.y+a do
for z=p.pos.z-a,p.pos.z+a do
local lpos = {x=x,y=y,z=z}
local n = minetest.get_node(lpos)
if n == "air" then
table.insert(l.nodes,{p=lpos,air=true})
else
table.insert(l.nodes,{n=minetest.get_node(lpos),p=lpos,m=minetest.get_meta(lpos):to_table()})
end
end
end
end
for i,ob in ipairs(minetest.get_objects_in_area(vector.add(p.pos,a),vector.subtract(p.pos,a))) do
local en = ob:get_luaentity()
if en and not ob:get_attach() then
local data
if en and en.get_staticdata then
data = en:get_staticdata() or ""
end
table.insert(l.objects,{n=en.name,data=data,p=ob:get_pos()})
ob:remove()
end
end
p.layer = p.layer == 2 and 1 or 2
local l = p["layer"..p.layer]
for i,v in ipairs(l.nodes) do
if v.air then
minetest.set_node(v.p,{name="air"})
else
minetest.set_node(v.p,v.n)
minetest.get_meta(v.p):from_table(v.m)
end
end
for i,v in ipairs(l.objects) do
local ob = minetest.add_entity(v.p, v.n)
local en = ob:get_luaentity()
if en.on_activate then
en:on_activate(v.data,4)
end
end
l.objects = {}
end
})