mirror of
https://github.com/mt-mods/pipeworks.git
synced 2024-12-24 18:00:22 +01:00
local-ize a few more functions
This commit is contained in:
parent
2481c06bf0
commit
53f6e67399
@ -1,24 +1,13 @@
|
||||
-- autorouting for pneumatic tubes
|
||||
|
||||
function pipeworks.scan_for_tube_objects(pos)
|
||||
if pos == nil then return end
|
||||
tube_autoroute({ x=pos.x-1, y=pos.y , z=pos.z })
|
||||
tube_autoroute({ x=pos.x+1, y=pos.y , z=pos.z })
|
||||
tube_autoroute({ x=pos.x , y=pos.y-1, z=pos.z })
|
||||
tube_autoroute({ x=pos.x , y=pos.y+1, z=pos.z })
|
||||
tube_autoroute({ x=pos.x , y=pos.y , z=pos.z-1 })
|
||||
tube_autoroute({ x=pos.x , y=pos.y , z=pos.z+1 })
|
||||
tube_autoroute(pos)
|
||||
end
|
||||
|
||||
function in_table(table,element)
|
||||
local function in_table(table,element)
|
||||
for _,el in ipairs(table) do
|
||||
if el==element then return true end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function is_tube(nodename)
|
||||
local function is_tube(nodename)
|
||||
return in_table(tubenodes,nodename)
|
||||
end
|
||||
|
||||
@ -84,7 +73,7 @@ local function nodeside(node, tubedir)
|
||||
minetest.log("error", "nodeside has been confused by its parameters; see pipeworks autoplace_tubes.lua, line 78")
|
||||
end
|
||||
|
||||
function tube_autoroute(pos)
|
||||
local function tube_autoroute(pos)
|
||||
local active = {0, 0, 0, 0, 0, 0}
|
||||
local nctr = minetest.get_node(pos)
|
||||
if not is_tube(nctr.name) then return end
|
||||
@ -135,6 +124,17 @@ function tube_autoroute(pos)
|
||||
local nctr = minetest.get_node(pos)
|
||||
end
|
||||
|
||||
function pipeworks.scan_for_tube_objects(pos)
|
||||
if pos == nil then return end
|
||||
tube_autoroute({ x=pos.x-1, y=pos.y , z=pos.z })
|
||||
tube_autoroute({ x=pos.x+1, y=pos.y , z=pos.z })
|
||||
tube_autoroute({ x=pos.x , y=pos.y-1, z=pos.z })
|
||||
tube_autoroute({ x=pos.x , y=pos.y+1, z=pos.z })
|
||||
tube_autoroute({ x=pos.x , y=pos.y , z=pos.z-1 })
|
||||
tube_autoroute({ x=pos.x , y=pos.y , z=pos.z+1 })
|
||||
tube_autoroute(pos)
|
||||
end
|
||||
|
||||
minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack)
|
||||
if minetest.registered_items[newnode.name]
|
||||
and minetest.registered_items[newnode.name].tube
|
||||
|
@ -29,6 +29,14 @@ local fakePlayer = {
|
||||
-- perhaps a custom metaclass that errors specially when fakePlayer.<property> is not found?
|
||||
}
|
||||
|
||||
local function tube_item(pos, item)
|
||||
-- Take item in any format
|
||||
local stack = ItemStack(item)
|
||||
local obj = minetest.add_entity(pos, "pipeworks:tubed_item")
|
||||
obj:get_luaentity():set_item(stack:to_string())
|
||||
return obj
|
||||
end
|
||||
|
||||
-- adding two tube functions
|
||||
-- can_remove(pos,node,stack,dir) returns true if an item can be removed from that stack on that node
|
||||
-- remove_items(pos,node,stack,dir,count) removes count items and returns them
|
||||
@ -37,7 +45,7 @@ local fakePlayer = {
|
||||
|
||||
-- sname = the current name to allow for, or nil if it allows anything
|
||||
|
||||
function grabAndFire(frominv,frominvname,frompos,fromnode,sname,tube,idef,dir,all)
|
||||
local function grabAndFire(frominv,frominvname,frompos,fromnode,sname,tube,idef,dir,all)
|
||||
for spos,stack in ipairs(frominv:get_list(frominvname)) do
|
||||
if ( sname == nil and stack:get_name() ~= "") or stack:get_name()==sname then
|
||||
local doRemove = true
|
||||
@ -204,18 +212,129 @@ minetest.register_node("pipeworks:mese_filter", {
|
||||
end,
|
||||
})
|
||||
|
||||
function tube_item(pos, item)
|
||||
-- Take item in any format
|
||||
local stack = ItemStack(item)
|
||||
local obj = minetest.add_entity(pos, "pipeworks:tubed_item")
|
||||
obj:get_luaentity():set_item(stack:to_string())
|
||||
return obj
|
||||
end
|
||||
|
||||
local function roundpos(pos)
|
||||
return {x=math.floor(pos.x+0.5),y=math.floor(pos.y+0.5),z=math.floor(pos.z+0.5)}
|
||||
end
|
||||
|
||||
local function addVect(pos,vect)
|
||||
return {x=pos.x+vect.x,y=pos.y+vect.y,z=pos.z+vect.z}
|
||||
end
|
||||
|
||||
adjlist={{x=0,y=0,z=1},{x=0,y=0,z=-1},{x=0,y=1,z=0},{x=0,y=-1,z=0},{x=1,y=0,z=0},{x=-1,y=0,z=0}}
|
||||
|
||||
local function notvel(tbl,vel)
|
||||
local tbl2={}
|
||||
for _,val in ipairs(tbl) do
|
||||
if val.x~=-vel.x or val.y~=-vel.y or val.z~=-vel.z then table.insert(tbl2,val) end
|
||||
end
|
||||
return tbl2
|
||||
end
|
||||
|
||||
local function go_next(pos,velocity,stack)
|
||||
local chests={}
|
||||
local tubes={}
|
||||
local cnode=minetest.get_node(pos)
|
||||
local cmeta=minetest.get_meta(pos)
|
||||
local node
|
||||
local meta
|
||||
local tubelike
|
||||
local tube_receiver
|
||||
local len=1
|
||||
local n
|
||||
local can_go
|
||||
local speed=math.abs(velocity.x+velocity.y+velocity.z)
|
||||
local vel={x=velocity.x/speed,y=velocity.y/speed,z=velocity.z/speed,speed=speed}
|
||||
if speed>=4.1 then
|
||||
speed=4
|
||||
elseif speed>=1.1 then
|
||||
speed=speed-0.1
|
||||
else
|
||||
speed=1
|
||||
end
|
||||
vel.speed=speed
|
||||
if minetest.registered_nodes[cnode.name] and minetest.registered_nodes[cnode.name].tube and minetest.registered_nodes[cnode.name].tube.can_go then
|
||||
can_go=minetest.registered_nodes[cnode.name].tube.can_go(pos,node,vel,stack)
|
||||
else
|
||||
can_go=notvel(adjlist,vel)
|
||||
end
|
||||
for _,vect in ipairs(can_go) do
|
||||
npos=addVect(pos,vect)
|
||||
node=minetest.get_node(npos)
|
||||
tube_receiver=minetest.get_item_group(node.name,"tubedevice_receiver")
|
||||
meta=minetest.get_meta(npos)
|
||||
tubelike=meta:get_int("tubelike")
|
||||
if tube_receiver==1 then
|
||||
if minetest.registered_nodes[node.name].tube and
|
||||
minetest.registered_nodes[node.name].tube.can_insert and
|
||||
minetest.registered_nodes[node.name].tube.can_insert(npos,node,stack,vect) then
|
||||
local i=1
|
||||
repeat
|
||||
if chests[i]==nil then break end
|
||||
i=i+1
|
||||
until false
|
||||
chests[i]={}
|
||||
chests[i].pos=npos
|
||||
chests[i].vect=vect
|
||||
end
|
||||
elseif tubelike==1 then
|
||||
local i=1
|
||||
repeat
|
||||
if tubes[i]==nil then break end
|
||||
i=i+1
|
||||
until false
|
||||
tubes[i]={}
|
||||
tubes[i].pos=npos
|
||||
tubes[i].vect=vect
|
||||
end
|
||||
end
|
||||
if chests[1]==nil then--no chests found
|
||||
if tubes[1]==nil then
|
||||
return 0
|
||||
else
|
||||
local i=1
|
||||
repeat
|
||||
if tubes[i]==nil then break end
|
||||
i=i+1
|
||||
until false
|
||||
n=meta:get_int("tubedir")+1
|
||||
repeat
|
||||
if n>=i then
|
||||
n=n-i+1
|
||||
else
|
||||
break
|
||||
end
|
||||
until false
|
||||
if pipeworks.enable_cyclic_mode then
|
||||
meta:set_int("tubedir",n)
|
||||
end
|
||||
velocity.x=tubes[n].vect.x*vel.speed
|
||||
velocity.y=tubes[n].vect.y*vel.speed
|
||||
velocity.z=tubes[n].vect.z*vel.speed
|
||||
end
|
||||
else
|
||||
local i=1
|
||||
repeat
|
||||
if chests[i]==nil then break end
|
||||
i=i+1
|
||||
until false
|
||||
n=meta:get_int("tubedir")+1
|
||||
repeat
|
||||
if n>=i then
|
||||
n=n-i+1
|
||||
else
|
||||
break
|
||||
end
|
||||
until false
|
||||
if pipeworks.enable_cyclic_mode then
|
||||
meta:set_int("tubedir",n)
|
||||
end
|
||||
velocity.x=chests[n].vect.x*speed
|
||||
velocity.y=chests[n].vect.y*speed
|
||||
velocity.z=chests[n].vect.z*speed
|
||||
end
|
||||
return 1
|
||||
end
|
||||
|
||||
minetest.register_entity("pipeworks:tubed_item", {
|
||||
initial_properties = {
|
||||
hp_max = 1,
|
||||
@ -383,121 +502,4 @@ end
|
||||
})
|
||||
|
||||
|
||||
local function addVect(pos,vect)
|
||||
return {x=pos.x+vect.x,y=pos.y+vect.y,z=pos.z+vect.z}
|
||||
end
|
||||
|
||||
adjlist={{x=0,y=0,z=1},{x=0,y=0,z=-1},{x=0,y=1,z=0},{x=0,y=-1,z=0},{x=1,y=0,z=0},{x=-1,y=0,z=0}}
|
||||
|
||||
function notvel(tbl,vel)
|
||||
local tbl2={}
|
||||
for _,val in ipairs(tbl) do
|
||||
if val.x~=-vel.x or val.y~=-vel.y or val.z~=-vel.z then table.insert(tbl2,val) end
|
||||
end
|
||||
return tbl2
|
||||
end
|
||||
|
||||
function go_next(pos,velocity,stack)
|
||||
local chests={}
|
||||
local tubes={}
|
||||
local cnode=minetest.get_node(pos)
|
||||
local cmeta=minetest.get_meta(pos)
|
||||
local node
|
||||
local meta
|
||||
local tubelike
|
||||
local tube_receiver
|
||||
local len=1
|
||||
local n
|
||||
local can_go
|
||||
local speed=math.abs(velocity.x+velocity.y+velocity.z)
|
||||
local vel={x=velocity.x/speed,y=velocity.y/speed,z=velocity.z/speed,speed=speed}
|
||||
if speed>=4.1 then
|
||||
speed=4
|
||||
elseif speed>=1.1 then
|
||||
speed=speed-0.1
|
||||
else
|
||||
speed=1
|
||||
end
|
||||
vel.speed=speed
|
||||
if minetest.registered_nodes[cnode.name] and minetest.registered_nodes[cnode.name].tube and minetest.registered_nodes[cnode.name].tube.can_go then
|
||||
can_go=minetest.registered_nodes[cnode.name].tube.can_go(pos,node,vel,stack)
|
||||
else
|
||||
can_go=notvel(adjlist,vel)
|
||||
end
|
||||
for _,vect in ipairs(can_go) do
|
||||
npos=addVect(pos,vect)
|
||||
node=minetest.get_node(npos)
|
||||
tube_receiver=minetest.get_item_group(node.name,"tubedevice_receiver")
|
||||
meta=minetest.get_meta(npos)
|
||||
tubelike=meta:get_int("tubelike")
|
||||
if tube_receiver==1 then
|
||||
if minetest.registered_nodes[node.name].tube and
|
||||
minetest.registered_nodes[node.name].tube.can_insert and
|
||||
minetest.registered_nodes[node.name].tube.can_insert(npos,node,stack,vect) then
|
||||
local i=1
|
||||
repeat
|
||||
if chests[i]==nil then break end
|
||||
i=i+1
|
||||
until false
|
||||
chests[i]={}
|
||||
chests[i].pos=npos
|
||||
chests[i].vect=vect
|
||||
end
|
||||
elseif tubelike==1 then
|
||||
local i=1
|
||||
repeat
|
||||
if tubes[i]==nil then break end
|
||||
i=i+1
|
||||
until false
|
||||
tubes[i]={}
|
||||
tubes[i].pos=npos
|
||||
tubes[i].vect=vect
|
||||
end
|
||||
end
|
||||
if chests[1]==nil then--no chests found
|
||||
if tubes[1]==nil then
|
||||
return 0
|
||||
else
|
||||
local i=1
|
||||
repeat
|
||||
if tubes[i]==nil then break end
|
||||
i=i+1
|
||||
until false
|
||||
n=meta:get_int("tubedir")+1
|
||||
repeat
|
||||
if n>=i then
|
||||
n=n-i+1
|
||||
else
|
||||
break
|
||||
end
|
||||
until false
|
||||
if pipeworks.enable_cyclic_mode then
|
||||
meta:set_int("tubedir",n)
|
||||
end
|
||||
velocity.x=tubes[n].vect.x*vel.speed
|
||||
velocity.y=tubes[n].vect.y*vel.speed
|
||||
velocity.z=tubes[n].vect.z*vel.speed
|
||||
end
|
||||
else
|
||||
local i=1
|
||||
repeat
|
||||
if chests[i]==nil then break end
|
||||
i=i+1
|
||||
until false
|
||||
n=meta:get_int("tubedir")+1
|
||||
repeat
|
||||
if n>=i then
|
||||
n=n-i+1
|
||||
else
|
||||
break
|
||||
end
|
||||
until false
|
||||
if pipeworks.enable_cyclic_mode then
|
||||
meta:set_int("tubedir",n)
|
||||
end
|
||||
velocity.x=chests[n].vect.x*speed
|
||||
velocity.y=chests[n].vect.y*speed
|
||||
velocity.z=chests[n].vect.z*speed
|
||||
end
|
||||
return 1
|
||||
end
|
||||
|
Loading…
Reference in New Issue
Block a user