Fix: comping metadata when moving (yellow tool), stacking (orange tool), book paste

This commit is contained in:
Deet Mit 2022-01-04 23:04:19 +01:00
parent e28f8c1238
commit 0ceebf0d72
6 changed files with 98 additions and 54 deletions

@ -54,9 +54,8 @@ local function show_dialog_full(user,file)
end
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "mesecons_autotools:circuit_new" then return end
if (fields.save) or fields.key_enter_field == "title" then
@ -100,9 +99,12 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
local pos1 = mesecons_autotools.get_pos(user,1)
local pos2 = mesecons_autotools.get_pos(user,2)
local nodes = selection_to_m3(pos1,pos2,direction)
local metas = selection_to_m3_meta(pos1,pos2,direction)
info.nodes = nodes
info.metas = metas
save_table_to_file(file,info)
end
end
@ -269,7 +271,7 @@ function paste_circuit(sel,file,direction)
--local rotate_direction = diff_directions(direction)
--local nodes = rotate_m3(info.nodes,direction)
local nodes = info.nodes
local metas = info.metas
local sx = nodes.sx
local sy = nodes.sy
@ -292,9 +294,12 @@ function paste_circuit(sel,file,direction)
if is_in_selection(sel,pos) then
local node = m3_get(nodes,xi,yi,zi)
local meta = m3_get(metas,xi,yi,zi)
node = rotate_node(node,{x=0,y=0,z=1},direction)
--minetest.set_node(pos, node)
mesecons_autotools.set_node(pos,node,"paste_circuit")
--mesecons_autotools.set_node(pos,node,"paste_circuit")
minetest.set_node(pos,node)
minetest.get_meta(pos):from_table(meta)
end
end

@ -180,6 +180,22 @@ function selection_to_m3(pos1,pos2,direction)
return m
end
function selection_to_m3_meta(pos1,pos2,direction)
local m = {}
iterate_selection(pos1,pos2,function(pos)
local meta = minetest.get_meta(pos):to_table()
m3_set(m,pos.x,pos.y,pos.z,meta)
end)
m.pos1 = pos1
m.pos2 = pos2
m = m3_move_to_000(m)
m = rotate_m3(m,direction)
return m
end
function m3_to_mx(m)
local mx={}

@ -1,3 +1,16 @@
local n01 = "mesecons_extrawires:crossover_01"
local n10 = "mesecons_extrawires:crossover_10"
-- axuliary function
function switch (name)
if( name == n01 ) then
return n10
else
return n01
end
end
function rotate_node_to_direction(node,direction)
local add = 0
if direction.x == 1 then add = 3 end
@ -9,6 +22,15 @@ function rotate_node_to_direction(node,direction)
param2 = (param2+add)% 4
if( node.name == n01 or node.name == n10 ) then
if( add % 2 == 0 ) then
return { name = node.name, param2=param2}
else
return { name = switch(node.name), param2=param2}
end
end
return { name = node.name , param2 = param2 }
end
@ -44,5 +66,15 @@ function rotate_node(node, saved_direction,direction)
new_node.name = node.name
new_node.param2 = (node.param2+rotate)%4
-- an exception, special treatement of crossover wire
if( node.name == n01 or node.name == n10 ) then
if( rotate % 2 == 0 ) then
new_node = node
else
new_node = {name = switch(node.name), param2=node.param2}
end
end
return new_node
end

@ -206,36 +206,6 @@ end
mesecons_autotools.set_node = function(pos,node,why)
--[[
if node.name == "air" then
local n = minetest.get_node(pos)
mesecon.on_dignode(pos,n)
ref_remove(pos,n)
minetest.set_node(pos,node)
-- ref_place ???
else
local n = minetest.get_node(pos)
mesecon.on_dignode(pos,n)
ref_remove(pos,n)
minetest.set_node(pos,node)
mesecon.on_placenode(pos,node)
ref_place(pos,node)
end
if true then return end
local n = minetest.get_node(pos)
mesecon.on_dignode(pos,n)
ref_remove(pos,n)
minetest.set_node(pos,node)
mesecon.on_placenode(pos,node)
ref_place(pos,node)
if true then return end
]]--
if why == nil then
minetest.set_node(pos,node)
@ -308,24 +278,6 @@ mesecons_autotools.set_node = function(pos,node,why)
minetest.set_node(pos,node)
end
--[[
if is_in_list({"delete_crossover"},why) then
minetest.set_node(pos,node)
mesecon.on_placenode(pos,node)
ref_remove(pos,node)
end
if is_in_list({"delete_end"},why) then
minetest.set_node(pos,{name="air"})
mesecon.on_dignode(pos,node)
ref_remove(pos,node)
--mesecon.on_dignode(pos,{name="air"})
--mesecon.receiver_remove(pos,node)
--minetest.set_node(pos,node)
--mesecon.on_placenode(pos,node)
end
]]--
end

@ -36,12 +36,19 @@ end
function copy(pos1,pos2, shift_vector)
iterate_selection(pos1,pos2, function(pos)
local node = minetest.get_node(pos)
local meta = minetest.get_meta(pos):to_table()
local new_pos = vector.add(pos,shift_vector)
--minetest.set_node(new_pos, node)
mesecons_autotools.set_node(new_pos, node,"copy")
--mesecons_autotools.set_node(new_pos, node,"copy")
minetest.set_node(new_pos,node)
minetest.get_meta(new_pos):from_table(meta)
end)
end
--[[
function copy_to_buffor(pos1,pos2,buffor)
iterate_selection(pos1,pos2, function(pos)
local node = minetest.get_node(pos)
@ -62,12 +69,43 @@ function paste_from_buffor(shift_vector,buffor)
end
end
]]--
function copy_to_buffor(pos1,pos2,buffor)
iterate_selection(pos1,pos2, function(pos)
local node = minetest.get_node(pos)
local meta = minetest.get_meta(pos):to_table()
table.insert(buffor, { node = { pos = pos, node = node }, meta = meta} )
end)
end
function paste_from_buffor(shift_vector,buffor)
for _,v in pairs(buffor) do
local pos = v.node.pos
local node = v.node.node
local meta = v.meta
local new_pos = vector.add(pos,shift_vector)
minetest.set_node(new_pos,node)
minetest.get_meta(new_pos):from_table(meta)
--mesecons_autotools.set_node(new_pos,node,"paste_from_buffor")
end
end
function delete(pos1,pos2)
iterate_selection(pos1,pos2, function(pos)
minetest.set_node(pos,{ name = "air" } )
minetest.get_meta(pos):from_table({})
end)
end

@ -179,7 +179,8 @@ local function move_selection(user,rad,click)
copy_to_buffor(pos[1],pos[2],buffor)
tail = generate_tail_wires(back_wall,direction)
print("yellow.buffor= " .. dump(buffor) )
delete(pos[1],pos[2])
paste_from_buffor(direction,buffor)
put_tail_wires(tail,direction)