diff --git a/mesecons_autotools/book/circuit.lua b/mesecons_autotools/book/circuit.lua index 3b8d958..0d61487 100644 --- a/mesecons_autotools/book/circuit.lua +++ b/mesecons_autotools/book/circuit.lua @@ -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 diff --git a/mesecons_autotools/book/m3.lua b/mesecons_autotools/book/m3.lua index cda6c53..5770052 100644 --- a/mesecons_autotools/book/m3.lua +++ b/mesecons_autotools/book/m3.lua @@ -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={} diff --git a/mesecons_autotools/book/misc.lua b/mesecons_autotools/book/misc.lua index beeec48..df310a0 100644 --- a/mesecons_autotools/book/misc.lua +++ b/mesecons_autotools/book/misc.lua @@ -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 diff --git a/mesecons_autotools/init.lua b/mesecons_autotools/init.lua index a9bff3f..76bd7ab 100644 --- a/mesecons_autotools/init.lua +++ b/mesecons_autotools/init.lua @@ -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 diff --git a/mesecons_autotools/tools/selection.lua b/mesecons_autotools/tools/selection.lua index 42271f8..3694a39 100644 --- a/mesecons_autotools/tools/selection.lua +++ b/mesecons_autotools/tools/selection.lua @@ -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 diff --git a/mesecons_autotools/tools/yellow/yellow.lua b/mesecons_autotools/tools/yellow/yellow.lua index 5b16542..a4fcb3e 100644 --- a/mesecons_autotools/tools/yellow/yellow.lua +++ b/mesecons_autotools/tools/yellow/yellow.lua @@ -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)