mirror of
https://gitlab.com/deetmit/mesecons_x.git
synced 2024-10-11 12:03:09 +02:00
218 lines
5.9 KiB
Lua
218 lines
5.9 KiB
Lua
|
|
function can_move_into(sel,direction)
|
|
local front_wall = front_wall_by_direction(sel,direction)
|
|
|
|
local pos1 = vector.new(front_wall.pos1)
|
|
local pos2 = vector.new(front_wall.pos2)
|
|
|
|
pos1 = vector.add(pos1,direction)
|
|
pos2 = vector.add(pos2,direction)
|
|
|
|
local shifted ={pos1=pos1,pos2=pos2}
|
|
|
|
local result = {}
|
|
iterate_selection(pos1,pos2, function(pos)
|
|
local node = minetest.get_node(pos)
|
|
local name = node.name
|
|
|
|
if name == "air" then
|
|
return
|
|
end
|
|
if
|
|
name == "mesecons_insulated:insulated_off" or
|
|
name == "mesecons_insulated:insulated_on" then
|
|
|
|
local pins = get_pins_from_pos(pos)
|
|
local dpin = get_pin_from_direction(direction)
|
|
if pins[dpin] == 1 then
|
|
return
|
|
else
|
|
table.insert(result,false)
|
|
return
|
|
end
|
|
|
|
|
|
end
|
|
return table.insert(result,false)
|
|
end)
|
|
|
|
for _,v in pairs(result) do
|
|
if v == false then
|
|
return false
|
|
end
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
|
|
function is_pos_connected(pos,direction)
|
|
local node = minetest.get_node(pos)
|
|
|
|
local pins = get_pins_from_pos(pos)
|
|
local dpin = get_pin_from_direction(direction)
|
|
|
|
-- no sticking out
|
|
if pins[dpin] == 0 then return false end
|
|
|
|
|
|
local neigh_pos
|
|
local neigh_pins
|
|
local connect_pin
|
|
|
|
-- checking pos[out] <-> neigh[in]
|
|
|
|
pins = get_pins_from_pos(pos,"output")
|
|
dpin = get_pin_from_direction(direction)
|
|
neigh_pos = hop_pos(pos,dpin)
|
|
neigh_pins = get_pins_from_pos(neigh_pos,"input")
|
|
connect_pin = neigh_pins[ hop_pin(dpin) ]
|
|
|
|
if connect_pin == 1 then
|
|
return true
|
|
end
|
|
|
|
-- checking pos[in] <-> neidth[out]
|
|
|
|
pins = get_pins_from_pos(pos,"input")
|
|
dpin = get_pin_from_direction(direction)
|
|
neigh_pos = hop_pos(pos,dpin)
|
|
neigh_pins = get_pins_from_pos(neigh_pos,"output")
|
|
connect_pin = neigh_pins[ hop_pin(dpin) ]
|
|
|
|
if connect_pin == 1 then
|
|
return true
|
|
end
|
|
|
|
|
|
|
|
return false
|
|
|
|
|
|
|
|
--[[
|
|
local neigh_pos = hop_pos(pos,dpin)
|
|
local neigh_pins = get_pins_from_pos(neigh_pos)
|
|
local connect_pin = neigh_pins[ hop_pin(dpin) ]
|
|
|
|
if connect_pin == 1 then
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
]]--
|
|
end
|
|
|
|
|
|
function generate_tail_wires(back_wall,direction)
|
|
local pos1 = back_wall.pos1
|
|
local pos2 = back_wall.pos2
|
|
|
|
local back_direction = vector.multiply(direction,-1)
|
|
local bd_pin = get_pin_from_direction(back_direction)
|
|
|
|
|
|
local list_pos = {}
|
|
iterate_selection(pos1,pos2, function(pos)
|
|
if is_pos_connected(pos,back_direction) then
|
|
table.insert(list_pos,pos)
|
|
end
|
|
end)
|
|
return list_pos
|
|
end
|
|
|
|
function put_tail_wires(list,direction)
|
|
local node = {}
|
|
node.name = "mesecons_insulated:insulated_off"
|
|
node.param2 = 0
|
|
for _,pos in ipairs(list) do
|
|
if direction.x ~= 0 then
|
|
node.param2 = 0
|
|
else
|
|
node.param2 = 1
|
|
end
|
|
--minetest.set_node(pos,node)
|
|
mesecons_autotools.set_node(pos,node,"put_tail_wires")
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
function get_back_wall(sel,direction)
|
|
return front_wall_by_direction(sel, vector.multiply(direction,-1))
|
|
end
|
|
|
|
|
|
|
|
|
|
local function move_selection(user,rad,click)
|
|
local dir = radians_to_vectors(rad)
|
|
local left = dir.left
|
|
local right = dir.right
|
|
|
|
local pos = {}
|
|
pos[1] = mesecons_autotools.get_pos(user,1)
|
|
pos[2] = mesecons_autotools.get_pos(user,2)
|
|
|
|
|
|
if pos[1] == nil then return end
|
|
if pos[2] == nil then return end
|
|
|
|
|
|
-- compute shift vector
|
|
|
|
local direction = {}
|
|
if click == "left" then
|
|
direction = left
|
|
else
|
|
direction = right
|
|
end
|
|
|
|
local buffor = {}
|
|
local tail = {}
|
|
local sel = { pos1=pos[1], pos2=pos[2]}
|
|
local back_wall = get_back_wall(sel,direction)
|
|
|
|
if not can_move_into(sel,direction) then return end
|
|
|
|
copy_to_buffor(pos[1],pos[2],buffor)
|
|
tail = generate_tail_wires(back_wall,direction)
|
|
|
|
|
|
delete(pos[1],pos[2])
|
|
paste_from_buffor(direction,buffor)
|
|
put_tail_wires(tail,direction)
|
|
|
|
shift_selection(user,direction)
|
|
|
|
|
|
-- Update
|
|
mesecons_autotools.render(user)
|
|
mesecons_autotools.zero_stack_counter(user)
|
|
mesecons_autotools.zero_stack_direction(user)
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mesecons_autotools.register_action("yellow","left","air", function(user,pos,rad)
|
|
move_selection(user,rad,"left")
|
|
end)
|
|
mesecons_autotools.register_action("yellow","left","block", function(user,pos,rad)
|
|
move_selection(user,rad,"left")
|
|
end)
|
|
|
|
mesecons_autotools.register_action("yellow","right","block", function(user,pos,rad)
|
|
move_selection(user,rad,"right")
|
|
end)
|
|
|
|
mesecons_autotools.register_action("yellow","right","air", function(user,pos,rad)
|
|
move_selection(user,rad,"right")
|
|
end)
|
|
|
|
|
|
|
|
|