mirror of
https://gitlab.com/deetmit/mesecons_x.git
synced 2024-08-18 20:34:09 +02:00
Fix: comping metadata when moving (yellow tool), stacking (orange tool), book paste
This commit is contained in:
parent
e28f8c1238
commit
0ceebf0d72
@ -54,9 +54,8 @@ local function show_dialog_full(user,file)
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||||
|
|
||||||
if formname ~= "mesecons_autotools:circuit_new" then return end
|
if formname ~= "mesecons_autotools:circuit_new" then return end
|
||||||
|
|
||||||
if (fields.save) or fields.key_enter_field == "title" then
|
if (fields.save) or fields.key_enter_field == "title" then
|
||||||
@ -101,8 +100,11 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
|||||||
local pos2 = mesecons_autotools.get_pos(user,2)
|
local pos2 = mesecons_autotools.get_pos(user,2)
|
||||||
local nodes = selection_to_m3(pos1,pos2,direction)
|
local nodes = selection_to_m3(pos1,pos2,direction)
|
||||||
|
|
||||||
|
local metas = selection_to_m3_meta(pos1,pos2,direction)
|
||||||
|
|
||||||
|
|
||||||
info.nodes = nodes
|
info.nodes = nodes
|
||||||
|
info.metas = metas
|
||||||
save_table_to_file(file,info)
|
save_table_to_file(file,info)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -269,7 +271,7 @@ function paste_circuit(sel,file,direction)
|
|||||||
--local rotate_direction = diff_directions(direction)
|
--local rotate_direction = diff_directions(direction)
|
||||||
--local nodes = rotate_m3(info.nodes,direction)
|
--local nodes = rotate_m3(info.nodes,direction)
|
||||||
local nodes = info.nodes
|
local nodes = info.nodes
|
||||||
|
local metas = info.metas
|
||||||
|
|
||||||
local sx = nodes.sx
|
local sx = nodes.sx
|
||||||
local sy = nodes.sy
|
local sy = nodes.sy
|
||||||
@ -292,9 +294,12 @@ function paste_circuit(sel,file,direction)
|
|||||||
if is_in_selection(sel,pos) then
|
if is_in_selection(sel,pos) then
|
||||||
|
|
||||||
local node = m3_get(nodes,xi,yi,zi)
|
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)
|
node = rotate_node(node,{x=0,y=0,z=1},direction)
|
||||||
--minetest.set_node(pos, node)
|
--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
|
||||||
|
|
||||||
end
|
end
|
||||||
|
@ -180,6 +180,22 @@ function selection_to_m3(pos1,pos2,direction)
|
|||||||
return m
|
return m
|
||||||
end
|
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)
|
function m3_to_mx(m)
|
||||||
local mx={}
|
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)
|
function rotate_node_to_direction(node,direction)
|
||||||
local add = 0
|
local add = 0
|
||||||
if direction.x == 1 then add = 3 end
|
if direction.x == 1 then add = 3 end
|
||||||
@ -9,6 +22,15 @@ function rotate_node_to_direction(node,direction)
|
|||||||
|
|
||||||
param2 = (param2+add)% 4
|
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 }
|
return { name = node.name , param2 = param2 }
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -44,5 +66,15 @@ function rotate_node(node, saved_direction,direction)
|
|||||||
new_node.name = node.name
|
new_node.name = node.name
|
||||||
new_node.param2 = (node.param2+rotate)%4
|
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
|
return new_node
|
||||||
end
|
end
|
||||||
|
@ -206,36 +206,6 @@ end
|
|||||||
|
|
||||||
|
|
||||||
mesecons_autotools.set_node = function(pos,node,why)
|
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
|
if why == nil then
|
||||||
minetest.set_node(pos,node)
|
minetest.set_node(pos,node)
|
||||||
@ -308,24 +278,6 @@ mesecons_autotools.set_node = function(pos,node,why)
|
|||||||
minetest.set_node(pos,node)
|
minetest.set_node(pos,node)
|
||||||
end
|
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
|
end
|
||||||
|
|
||||||
|
@ -36,12 +36,19 @@ end
|
|||||||
function copy(pos1,pos2, shift_vector)
|
function copy(pos1,pos2, shift_vector)
|
||||||
iterate_selection(pos1,pos2, function(pos)
|
iterate_selection(pos1,pos2, function(pos)
|
||||||
local node = minetest.get_node(pos)
|
local node = minetest.get_node(pos)
|
||||||
|
local meta = minetest.get_meta(pos):to_table()
|
||||||
|
|
||||||
local new_pos = vector.add(pos,shift_vector)
|
local new_pos = vector.add(pos,shift_vector)
|
||||||
--minetest.set_node(new_pos, node)
|
--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)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
--[[
|
||||||
function copy_to_buffor(pos1,pos2,buffor)
|
function copy_to_buffor(pos1,pos2,buffor)
|
||||||
iterate_selection(pos1,pos2, function(pos)
|
iterate_selection(pos1,pos2, function(pos)
|
||||||
local node = minetest.get_node(pos)
|
local node = minetest.get_node(pos)
|
||||||
@ -62,12 +69,43 @@ function paste_from_buffor(shift_vector,buffor)
|
|||||||
end
|
end
|
||||||
|
|
||||||
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)
|
function delete(pos1,pos2)
|
||||||
iterate_selection(pos1,pos2, function(pos)
|
iterate_selection(pos1,pos2, function(pos)
|
||||||
minetest.set_node(pos,{ name = "air" } )
|
minetest.set_node(pos,{ name = "air" } )
|
||||||
|
minetest.get_meta(pos):from_table({})
|
||||||
end)
|
end)
|
||||||
|
|
||||||
end
|
end
|
||||||
|
@ -179,6 +179,7 @@ local function move_selection(user,rad,click)
|
|||||||
copy_to_buffor(pos[1],pos[2],buffor)
|
copy_to_buffor(pos[1],pos[2],buffor)
|
||||||
tail = generate_tail_wires(back_wall,direction)
|
tail = generate_tail_wires(back_wall,direction)
|
||||||
|
|
||||||
|
print("yellow.buffor= " .. dump(buffor) )
|
||||||
|
|
||||||
delete(pos[1],pos[2])
|
delete(pos[1],pos[2])
|
||||||
paste_from_buffor(direction,buffor)
|
paste_from_buffor(direction,buffor)
|
||||||
|
Loading…
Reference in New Issue
Block a user