Use only 1 node for frame motors.

This commit is contained in:
Novatux 2013-08-31 15:04:08 +02:00
parent 8b8e0a02c7
commit 48ea6fb99d
1 changed files with 21 additions and 200 deletions

View File

@ -141,211 +141,28 @@ end
end
end
function frame_motor1_on(pos,node)
local npos={x=pos.x,y=pos.y+1,z=pos.z}
local nnode=minetest.env:get_node(npos)
if node.param2==0 then
dir={x=1,y=0,z=0}
elseif node.param2==1 then
dir={x=0,y=0,z=-1}
elseif node.param2==2 then
dir={x=-1,y=0,z=0}
else
dir={x=0,y=0,z=1}
end
function frame_motor_on(pos, node)
local dirs = {{x=0,y=1,z=0},{x=0,y=0,z=1},{x=0,y=0,z=-1},{x=1,y=0,z=0},{x=-1,y=0,z=0},{x=0,y=-1,z=0}}
local nnodepos = frames.addVect(pos, dirs[math.floor(node.param2/4)+1])
local dir = minetest.facedir_to_dir(node.param2)
local nnode=minetest.get_node(nnodepos)
if minetest.registered_nodes[nnode.name].frame==1 then
local connected_nodes=get_connected_nodes(npos)
move_nodes_vect(connected_nodes,dir)
local connected_nodes=get_connected_nodes(nnodepos)
move_nodes_vect(connected_nodes,dir,pos)
end
end
function frame_motor2_on(pos,node)
local npos={x=pos.x,y=pos.y-1,z=pos.z}
local nnode=minetest.env:get_node(npos)
if node.param2==0 then
dir={x=1,y=0,z=0}
elseif node.param2==1 then
dir={x=0,y=0,z=-1}
elseif node.param2==2 then
dir={x=-1,y=0,z=0}
else
dir={x=0,y=0,z=1}
end
if minetest.registered_nodes[nnode.name].frame==1 then
local connected_nodes=get_connected_nodes(npos)
move_nodes_vect(connected_nodes,dir)
end
end
function frame_motor3_on(pos,node)
local npos={x=pos.x,y=pos.y,z=pos.z}
if node.param2==0 then
dir={x=1,y=0,z=0}
npos.z=npos.z-1
elseif node.param2==1 then
dir={x=0,y=0,z=-1}
npos.x=npos.x-1
elseif node.param2==2 then
dir={x=-1,y=0,z=0}
npos.z=npos.z+1
else
dir={x=0,y=0,z=1}
npos.x=npos.x+1
end
local nnode=minetest.env:get_node(npos)
if minetest.registered_nodes[nnode.name].frame==1 then
local connected_nodes=get_connected_nodes(npos)
move_nodes_vect(connected_nodes,dir)
end
end
function frame_motor4_on(pos,node)
local npos={x=pos.x,y=pos.y,z=pos.z}
if node.param2==0 then
dir={x=-1,y=0,z=0}
npos.z=npos.z-1
elseif node.param2==1 then
dir={x=0,y=0,z=1}
npos.x=npos.x-1
elseif node.param2==2 then
dir={x=1,y=0,z=0}
npos.z=npos.z+1
else
dir={x=0,y=0,z=-1}
npos.x=npos.x+1
end
local nnode=minetest.env:get_node(npos)
if minetest.registered_nodes[nnode.name].frame==1 then
local connected_nodes=get_connected_nodes(npos)
move_nodes_vect(connected_nodes,dir)
end
end
function frame_motor5_on(pos,node)
local npos={x=pos.x,y=pos.y,z=pos.z}
if node.param2==0 then
npos.z=npos.z-1
elseif node.param2==1 then
npos.x=npos.x-1
elseif node.param2==2 then
npos.z=npos.z+1
else
npos.x=npos.x+1
end
dir={x=0,y=1,z=0}
local nnode=minetest.env:get_node(npos)
if minetest.registered_nodes[nnode.name].frame==1 then
local connected_nodes=get_connected_nodes(npos)
move_nodes_vect(connected_nodes,dir)
end
end
function frame_motor6_on(pos,node)
local npos={x=pos.x,y=pos.y,z=pos.z}
if node.param2==0 then
npos.z=npos.z-1
elseif node.param2==1 then
npos.x=npos.x-1
elseif node.param2==2 then
npos.z=npos.z+1
else
npos.x=npos.x+1
end
dir={x=0,y=-1,z=0}
local nnode=minetest.env:get_node(npos)
if minetest.registered_nodes[nnode.name].frame==1 then
local connected_nodes=get_connected_nodes(npos)
move_nodes_vect(connected_nodes,dir)
end
end
minetest.register_node("technic:frame_motor1",{
description = "Frame motor 1",
tiles = {"pipeworks_filter_top.png", "technic_lv_cable.png", "technic_lv_cable.png",
minetest.register_node("technic:frame_motor",{
description = "Frame motor",
tiles = {"pipeworks_filter_top.png^[transformR90", "technic_lv_cable.png", "technic_lv_cable.png",
"technic_lv_cable.png", "technic_lv_cable.png", "technic_lv_cable.png"},
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,mesecon=2},
paramtype2 = "facedir",
mesecons={effector={action_on=frame_motor1_on}},
mesecons={effector={action_on=frame_motor_on}},
frames_can_connect=function(pos,dir)
return dir.y~=-1
end
})
minetest.register_node("technic:frame_motor2",{
description = "Frame motor 2",
tiles = {"technic_lv_cable.png", "pipeworks_filter_top.png", "technic_lv_cable.png",
"technic_lv_cable.png", "technic_lv_cable.png", "technic_lv_cable.png"},
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,mesecon=2},
paramtype2 = "facedir",
mesecons={effector={action_on=frame_motor2_on}},
frames_can_connect=function(pos,dir)
return dir.y~=1
end
})
minetest.register_node("technic:frame_motor3",{
description = "Frame motor 3",
tiles = {"technic_lv_cable.png", "technic_lv_cable.png", "technic_lv_cable.png",
"technic_lv_cable.png", "technic_lv_cable.png", "pipeworks_filter_top.png"},
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,mesecon=2},
paramtype2 = "facedir",
mesecons={effector={action_on=frame_motor3_on}},
frames_can_connect=function(pos,dir)
local node=minetest.env:get_node(pos)
if node.param2==0 then return dir.z~=1
elseif node.param2==1 then return dir.x~=1
elseif node.param2==2 then return dir.z~=-1
else return dir.x~=-1 end
end
})
minetest.register_node("technic:frame_motor4",{
description = "Frame motor 4",
tiles = {"technic_lv_cable.png", "technic_lv_cable.png", "technic_lv_cable.png",
"technic_lv_cable.png", "technic_lv_cable.png", "pipeworks_filter_top.png^[transformR180"},
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,mesecon=2},
paramtype2 = "facedir",
mesecons={effector={action_on=frame_motor4_on}},
frames_can_connect=function(pos,dir)
local node=minetest.env:get_node(pos)
if node.param2==0 then return dir.z~=1
elseif node.param2==1 then return dir.x~=1
elseif node.param2==2 then return dir.z~=-1
else return dir.x~=-1 end
end
})
minetest.register_node("technic:frame_motor5",{
description = "Frame motor 5",
tiles = {"technic_lv_cable.png", "technic_lv_cable.png", "technic_lv_cable.png",
"technic_lv_cable.png", "technic_lv_cable.png", "pipeworks_filter_top.png^[transformR90"},
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,mesecon=2},
paramtype2 = "facedir",
mesecons={effector={action_on=frame_motor5_on}},
frames_can_connect=function(pos,dir)
local node=minetest.env:get_node(pos)
if node.param2==0 then return dir.z~=1
elseif node.param2==1 then return dir.x~=1
elseif node.param2==2 then return dir.z~=-1
else return dir.x~=-1 end
end
})
minetest.register_node("technic:frame_motor6",{
description = "Frame motor 6",
tiles = {"technic_lv_cable.png", "technic_lv_cable.png", "technic_lv_cable.png",
"technic_lv_cable.png", "technic_lv_cable.png", "pipeworks_filter_top.png^[transformR270"},
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,mesecon=2},
paramtype2 = "facedir",
mesecons={effector={action_on=frame_motor6_on}},
frames_can_connect=function(pos,dir)
local node=minetest.env:get_node(pos)
if node.param2==0 then return dir.z~=1
elseif node.param2==1 then return dir.x~=1
elseif node.param2==2 then return dir.z~=-1
else return dir.x~=-1 end
local node = minetest.get_node(pos)
local dir2 = ({{x=0,y=1,z=0},{x=0,y=0,z=1},{x=0,y=0,z=-1},{x=1,y=0,z=0},{x=-1,y=0,z=0},{x=0,y=-1,z=0}})[math.floor(node.param2/4)+1]
return dir2.x~=-dir.x or dir2.y~=-dir.y or dir2.z~=-dir.z
end
})
@ -360,12 +177,16 @@ function add_table(table,toadd)
table[i]=toadd
end
function move_nodes_vect(poslist,vect)
for _,pos in ipairs(poslist) do
function move_nodes_vect(poslist,vect,must_not_move)
for _,pos in ipairs(poslist) do
local npos=frames.addVect(pos,vect)
local name = minetest.env:get_node(npos).name
if (name~="air" and minetest.registered_nodes[name].liquidtype=="none") and not(pos_in_list(poslist,npos)) then
return end
return
end
if pos.x==must_not_move.x and pos.y==must_not_move.y and pos.z==must_not_move.z then
return
end
end
nodelist={}
for _,pos in ipairs(poslist) do