Version 1.0
* Added all features * Need fixes
1
mesecons_autotools
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 1b57d5d72b41a69fd3e3215e0aa4074f1db126e8
|
@ -1,391 +0,0 @@
|
||||
|
||||
|
||||
function delete_node(pos, direction_from)
|
||||
if( not is_wire(pos)) then
|
||||
return
|
||||
end
|
||||
|
||||
|
||||
local node = minetest.get_node(pos)
|
||||
local name = node.name
|
||||
local param2 = node.param2
|
||||
|
||||
if( (name == "mesecons_insulated:insulated_off") or (name == "mesecons_insulated:insulated_on") ) then
|
||||
-- wire
|
||||
if( (param2 == 0 ) or (param2 == 2) ) then
|
||||
if( direction_from == "u" ) then
|
||||
--nothing
|
||||
return
|
||||
elseif( direction_from == "d" ) then
|
||||
--nothing
|
||||
return
|
||||
elseif( direction_from == "r" ) then
|
||||
minetest.set_node(pos,{name="air"})
|
||||
local next_pos = { x = pos.x - 1, y = pos.y, z = pos.z }
|
||||
delete_node(next_pos,"r")
|
||||
return
|
||||
elseif( direction_from == "l" ) then
|
||||
minetest.set_node(pos,{name="air"})
|
||||
local next_pos = {x=pos.x+1,y=pos.y,z=pos.z}
|
||||
delete_node(next_pos,"l")
|
||||
return
|
||||
end
|
||||
end
|
||||
if( (param2 == 1 ) or (param2 == 3) ) then
|
||||
if( direction_from == "l" ) then
|
||||
--nothing
|
||||
return
|
||||
elseif( direction_from == "r" ) then
|
||||
--nothing
|
||||
return
|
||||
elseif( direction_from == "u" ) then
|
||||
minetest.set_node(pos,{name="air"})
|
||||
local next_pos = { x = pos.x , y = pos.y, z = pos.z -1}
|
||||
delete_node(next_pos,"u")
|
||||
return
|
||||
elseif( direction_from == "d" ) then
|
||||
minetest.set_node(pos,{name="air"})
|
||||
local next_pos = {x=pos.x,y=pos.y,z=pos.z+1}
|
||||
delete_node(next_pos,"d")
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
elseif (name == "mesecons_extrawires:corner_off") or (name == "mesecons_extrawires:corner_on") then
|
||||
-- corner
|
||||
if( param2 == 0 ) then
|
||||
if( direction_from == "u" ) then
|
||||
--nothing
|
||||
return
|
||||
elseif(direction_from == "r" ) then
|
||||
--nothing
|
||||
return
|
||||
elseif(direction_from == "l" ) then
|
||||
minetest.set_node(pos,{name="air"})
|
||||
local next_pos = {x=pos.x,y=pos.y,z=pos.z-1}
|
||||
delete_node(next_pos,"u")
|
||||
return
|
||||
elseif(direction_from == "d" ) then
|
||||
minetest.set_node(pos,{name="air"})
|
||||
local next_pos = {x=pos.x-1,y=pos.y,z=pos.z}
|
||||
delete_node(next_pos,"r")
|
||||
return
|
||||
end
|
||||
elseif (param2 == 1) then
|
||||
if( direction_from == "d" ) then
|
||||
--nothing
|
||||
return
|
||||
elseif(direction_from == "r" ) then
|
||||
--nothing
|
||||
return
|
||||
elseif(direction_from == "l" ) then
|
||||
minetest.set_node(pos,{name="air"})
|
||||
local next_pos = {x=pos.x,y=pos.y,z=pos.z+1}
|
||||
delete_node(next_pos,"d")
|
||||
return
|
||||
elseif(direction_from == "u" ) then
|
||||
minetest.set_node(pos,{name="air"})
|
||||
local next_pos = {x=pos.x-1,y=pos.y,z=pos.z}
|
||||
delete_node(next_pos,"r")
|
||||
return
|
||||
end
|
||||
elseif( param2 == 2 ) then
|
||||
if( direction_from == "l" ) then
|
||||
--nothing
|
||||
return
|
||||
elseif(direction_from == "d" ) then
|
||||
--nothing
|
||||
return
|
||||
elseif(direction_from == "u" ) then
|
||||
minetest.set_node(pos,{name="air"})
|
||||
local next_pos = {x=pos.x+1,y=pos.y,z=pos.z}
|
||||
delete_node(next_pos,"l")
|
||||
return
|
||||
elseif(direction_from == "r" ) then
|
||||
minetest.set_node(pos,{name="air"})
|
||||
local next_pos = {x=pos.x,y=pos.y,z=pos.z+1}
|
||||
delete_node(next_pos,"d")
|
||||
return
|
||||
end
|
||||
elseif( param2 == 3 ) then
|
||||
if( direction_from == "l" ) then
|
||||
--nothing
|
||||
return
|
||||
elseif(direction_from == "u" ) then
|
||||
--nothing
|
||||
return
|
||||
elseif(direction_from == "d" ) then
|
||||
minetest.set_node(pos,{name="air"})
|
||||
local next_pos = {x=pos.x+1,y=pos.y,z=pos.z}
|
||||
delete_node(next_pos,"l")
|
||||
return
|
||||
elseif(direction_from == "r" ) then
|
||||
minetest.set_node(pos,{name="air"})
|
||||
local next_pos = {x=pos.x,y=pos.y,z=pos.z-1}
|
||||
delete_node(next_pos,"u")
|
||||
return
|
||||
end
|
||||
end
|
||||
elseif( name=="mesecons_extrawires:crossover_off") then
|
||||
if( direction_from == "l" ) then
|
||||
local next_pos = {x=pos.x+1,y=pos.y,z=pos.z}
|
||||
minetest.set_node(pos,{name="mesecons_insulated:insulated_off", param2=1})
|
||||
delete_node(next_pos,"l")
|
||||
return
|
||||
elseif(direction_from == "u" ) then
|
||||
local next_pos = {x=pos.x,y=pos.y,z=pos.z-1}
|
||||
minetest.set_node(pos,{name="mesecons_insulated:insulated_off", param2=0})
|
||||
delete_node(next_pos,"u")
|
||||
return
|
||||
elseif(direction_from == "d" ) then
|
||||
local next_pos = {x=pos.x,y=pos.y,z=pos.z+1}
|
||||
minetest.set_node(pos,{name="mesecons_insulated:insulated_off", param2=0})
|
||||
delete_node(next_pos,"d")
|
||||
return
|
||||
elseif(direction_from == "r" ) then
|
||||
local next_pos = {x=pos.x-1,y=pos.y,z=pos.z}
|
||||
minetest.set_node(pos,{name="mesecons_insulated:insulated_off", param2=1})
|
||||
delete_node(next_pos,"r")
|
||||
return
|
||||
end
|
||||
|
||||
elseif (name=="mesecons_extrawires:crossover_10") then
|
||||
if( direction_from == "l" ) then
|
||||
local next_pos = {x=pos.x+1,y=pos.y,z=pos.z}
|
||||
minetest.set_node(pos,{name="mesecons_insulated:insulated_on", param2=1})
|
||||
delete_node(next_pos,"l")
|
||||
return
|
||||
elseif(direction_from == "u" ) then
|
||||
local next_pos = {x=pos.x,y=pos.y,z=pos.z-1}
|
||||
minetest.set_node(pos,{name="mesecons_insulated:insulated_off", param2=0})
|
||||
delete_node(next_pos,"u")
|
||||
return
|
||||
elseif(direction_from == "d" ) then
|
||||
local next_pos = {x=pos.x,y=pos.y,z=pos.z+1}
|
||||
minetest.set_node(pos,{name="mesecons_insulated:insulated_off", param2=0})
|
||||
delete_node(next_pos,"d")
|
||||
return
|
||||
elseif(direction_from == "r" ) then
|
||||
local next_pos = {x=pos.x-1,y=pos.y,z=pos.z}
|
||||
minetest.set_node(pos,{name="mesecons_insulated:insulated_on", param2=1})
|
||||
delete_node(next_pos,"r")
|
||||
return
|
||||
end
|
||||
|
||||
elseif (name=="mesecons_extrawires:crossover_01") then
|
||||
if( direction_from == "l" ) then
|
||||
local next_pos = {x=pos.x+1,y=pos.y,z=pos.z}
|
||||
minetest.set_node(pos,{name="mesecons_insulated:insulated_off", param2=1})
|
||||
delete_node(next_pos,"l")
|
||||
return
|
||||
elseif(direction_from == "u" ) then
|
||||
local next_pos = {x=pos.x,y=pos.y,z=pos.z-1}
|
||||
minetest.set_node(pos,{name="mesecons_insulated:insulated_on", param2=0})
|
||||
delete_node(next_pos,"u")
|
||||
return
|
||||
elseif(direction_from == "d" ) then
|
||||
local next_pos = {x=pos.x,y=pos.y,z=pos.z+1}
|
||||
minetest.set_node(pos,{name="mesecons_insulated:insulated_on", param2=0})
|
||||
delete_node(next_pos,"d")
|
||||
return
|
||||
elseif(direction_from == "r" ) then
|
||||
local next_pos = {x=pos.x-1,y=pos.y,z=pos.z}
|
||||
minetest.set_node(pos,{name="mesecons_insulated:insulated_off", param2=1})
|
||||
delete_node(next_pos,"r")
|
||||
return
|
||||
end
|
||||
|
||||
elseif (name=="mesecons_extrawires:crossover_on") then
|
||||
if( direction_from == "l" ) then
|
||||
local next_pos = {x=pos.x+1,y=pos.y,z=pos.z}
|
||||
minetest.set_node(pos,{name="mesecons_insulated:insulated_on", param2=1})
|
||||
delete_node(next_pos,"l")
|
||||
return
|
||||
elseif(direction_from == "u" ) then
|
||||
local next_pos = {x=pos.x,y=pos.y,z=pos.z-1}
|
||||
minetest.set_node(pos,{name="mesecons_insulated:insulated_on", param2=0})
|
||||
delete_node(next_pos,"u")
|
||||
return
|
||||
elseif(direction_from == "d" ) then
|
||||
local next_pos = {x=pos.x,y=pos.y,z=pos.z+1}
|
||||
minetest.set_node(pos,{name="mesecons_insulated:insulated_on", param2=0})
|
||||
delete_node(next_pos,"d")
|
||||
return
|
||||
elseif(direction_from == "r" ) then
|
||||
local next_pos = {x=pos.x-1,y=pos.y,z=pos.z}
|
||||
minetest.set_node(pos,{name="mesecons_insulated:insulated_on", param2=1})
|
||||
delete_node(next_pos,"r")
|
||||
return
|
||||
end
|
||||
|
||||
elseif (name=="mesecons_morewires:xjunction_off") then
|
||||
if( direction_from == "l" ) then
|
||||
minetest.set_node(pos,{name="mesecons_extrawires:tjunction_off", param2=3})
|
||||
return
|
||||
elseif(direction_from == "u" ) then
|
||||
minetest.set_node(pos,{name="mesecons_extrawires:tjunction_off", param2=0})
|
||||
return
|
||||
elseif(direction_from == "d" ) then
|
||||
minetest.set_node(pos,{name="mesecons_extrawires:tjunction_off", param2=2})
|
||||
return
|
||||
elseif(direction_from == "r" ) then
|
||||
minetest.set_node(pos,{name="mesecons_extrawires:tjunction_off", param2=1})
|
||||
return
|
||||
end
|
||||
|
||||
elseif (name=="mesecons_morewires:xjunction_on") then
|
||||
if( direction_from == "l" ) then
|
||||
minetest.set_node(pos,{name="mesecons_extrawires:tjunction_on", param2=3})
|
||||
return
|
||||
elseif(direction_from == "u" ) then
|
||||
minetest.set_node(pos,{name="mesecons_extrawires:tjunction_on", param2=0})
|
||||
return
|
||||
elseif(direction_from == "d" ) then
|
||||
minetest.set_node(pos,{name="mesecons_extrawires:tjunction_on", param2=2})
|
||||
return
|
||||
elseif(direction_from == "r" ) then
|
||||
minetest.set_node(pos,{name="mesecons_extrawires:tjunction_on", param2=1})
|
||||
return
|
||||
end
|
||||
|
||||
elseif( name == "mesecons_extrawires:tjunction_off" ) or ( name == "mesecons_extrawires:tjunction_on" )then
|
||||
local state = "on"
|
||||
if ( name == "mesecons_extrawires:tjunction_off" ) then
|
||||
state = "off"
|
||||
end
|
||||
if( param2 == 0 ) then
|
||||
if( direction_from == "l" ) then
|
||||
minetest.set_node(pos,{name="mesecons_extrawires:corner_"..state, param2 = 3})
|
||||
return
|
||||
elseif(direction_from == "u" ) then
|
||||
--nothing
|
||||
return
|
||||
elseif(direction_from == "d" ) then
|
||||
minetest.set_node(pos,{name="mesecons_insulated:insulated_"..state, param2 = 0})
|
||||
return
|
||||
elseif(direction_from == "r" ) then
|
||||
minetest.set_node(pos,{name="mesecons_extrawires:corner_"..state, param2 = 0})
|
||||
return
|
||||
end
|
||||
|
||||
elseif( param2 == 1 ) then
|
||||
if( direction_from == "u" ) then
|
||||
minetest.set_node(pos,{name="mesecons_extrawires:corner_"..state, param2 = 0})
|
||||
return
|
||||
elseif(direction_from == "r" ) then
|
||||
--nothing
|
||||
return
|
||||
elseif(direction_from == "l" ) then
|
||||
minetest.set_node(pos,{name="mesecons_insulated:insulated_"..state, param2 = 1})
|
||||
return
|
||||
elseif(direction_from == "d" ) then
|
||||
minetest.set_node(pos,{name="mesecons_extrawires:corner_"..state, param2 = 1})
|
||||
return
|
||||
end
|
||||
|
||||
elseif( param2 == 2 ) then
|
||||
if( direction_from == "l" ) then
|
||||
minetest.set_node(pos,{name="mesecons_extrawires:corner_"..state, param2 = 2})
|
||||
return
|
||||
elseif(direction_from == "d" ) then
|
||||
--nothing
|
||||
return
|
||||
elseif(direction_from == "u" ) then
|
||||
minetest.set_node(pos,{name="mesecons_insulated:insulated_"..state, param2 = 0})
|
||||
return
|
||||
elseif(direction_from == "r" ) then
|
||||
minetest.set_node(pos,{name="mesecons_extrawires:corner_"..state, param2 = 1})
|
||||
return
|
||||
end
|
||||
|
||||
elseif( param2 == 3) then
|
||||
if( direction_from == "u" ) then
|
||||
minetest.set_node(pos,{name="mesecons_extrawires:corner_"..state, param2 = 3})
|
||||
return
|
||||
elseif(direction_from == "l" ) then
|
||||
--nothing
|
||||
return
|
||||
elseif(direction_from == "r" ) then
|
||||
minetest.set_node(pos,{name="mesecons_insulated:insulated_"..state, param2 = 1})
|
||||
return
|
||||
elseif(direction_from == "d" ) then
|
||||
minetest.set_node(pos,{name="mesecons_extrawires:corner_"..state, param2 = 2})
|
||||
return
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
function delete(pos)
|
||||
-- local p = get_pins(pos)
|
||||
local p = get_pins_sticky(pos)
|
||||
if(p.u==1) then
|
||||
delete_node(up_node(pos),"d")
|
||||
end
|
||||
if(p.d==1) then
|
||||
delete_node(down_node(pos),"u")
|
||||
end
|
||||
if(p.l==1) then
|
||||
delete_node(left_node(pos),"r")
|
||||
end
|
||||
if(p.r==1) then
|
||||
delete_node(right_node(pos),"l")
|
||||
end
|
||||
|
||||
minetest.set_node(pos,{ name = "air" } )
|
||||
|
||||
end
|
||||
|
||||
local function delete_all_selection(pos1,pos2)
|
||||
local xf = math.min(pos1.x,pos2.x)
|
||||
local xt = math.max(pos1.x,pos2.x)
|
||||
local zf = math.min(pos1.z,pos2.z)
|
||||
local zt = math.max(pos1.z,pos2.z)
|
||||
|
||||
for i=xf,xt do
|
||||
for k = zf,zt do
|
||||
local cur = { x=i,z=k,y=pos1.y}
|
||||
minetest.set_node(cur,{name="air"})
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
|
||||
|
||||
minetest.register_craftitem("mesecons_autowire:delete", {
|
||||
description = "Tool Autodelete",
|
||||
inventory_image = "tool_autodelete.png",
|
||||
stack_max = 1,
|
||||
groups = { tool =1 },
|
||||
|
||||
on_place = function(itemstack, user, pointed_thing)
|
||||
local pos = pointed_thing.under
|
||||
if pointed_thing.type == "node" then
|
||||
if( is_wire(pos) ) then
|
||||
delete(pos)
|
||||
elseif( is_sticky(pos) ) then
|
||||
delete(pos)
|
||||
end
|
||||
end
|
||||
|
||||
end,
|
||||
on_secondary_use = function(itemstack, user, pointed_thing)
|
||||
if pointed_thing.type == "nothing" then
|
||||
if check_selection(mesecons_automove.pos1,mesecons_automove.pos2) then
|
||||
delete_all_selection(mesecons_automove.pos1,mesecons_automove.pos2)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
})
|
@ -1,627 +0,0 @@
|
||||
|
||||
mesecons_automove = {}
|
||||
|
||||
|
||||
local function put_node(pos,node)
|
||||
minetest.set_node(pos,node)
|
||||
-- mesecon.on_placenode(pos,node)
|
||||
end
|
||||
|
||||
local function put_node_activate(pos,node)
|
||||
minetest.set_node(pos,node)
|
||||
mesecon.on_placenode(pos,node)
|
||||
|
||||
end
|
||||
|
||||
|
||||
local function sort_xz(p1,p2)
|
||||
if (p1.x < p2.x ) then
|
||||
return p1,p2
|
||||
elseif( p1.x > p2.x ) then
|
||||
return p2,p1
|
||||
else
|
||||
-- p1.x == p2.x
|
||||
if( p1.z < p2.z ) then
|
||||
return p1,p2
|
||||
else
|
||||
return p2,p1
|
||||
end
|
||||
end
|
||||
return p1,p2
|
||||
end
|
||||
|
||||
function update_selection()
|
||||
if(mesecons_automove.pos1e ~= nil) then
|
||||
mesecons_automove.pos1e:remove()
|
||||
mesecons_automove.pos1e = nil
|
||||
end
|
||||
if(mesecons_automove.pos2e ~= nil) then
|
||||
mesecons_automove.pos2e:remove()
|
||||
mesecons_automove.pos2e = nil
|
||||
end
|
||||
|
||||
if(mesecons_automove.pos1 ~= nil ) then
|
||||
mesecons_automove.pos1e =
|
||||
minetest.add_entity(mesecons_automove.pos1,"mesecons_automove:pos1")
|
||||
end
|
||||
if(mesecons_automove.pos2 ~= nil ) then
|
||||
mesecons_automove.pos2e =
|
||||
minetest.add_entity(mesecons_automove.pos2,"mesecons_automove:pos2")
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
|
||||
--[[
|
||||
function update_selection()
|
||||
if( mesecons_automove.pos1 == nil ) or (mesecons_automove.pos2 == nil ) then return end
|
||||
|
||||
if( mesecons_automove.pos1 ~= nil ) and (mesecons_automove.pos1e ~= nil ) then
|
||||
mesecons_automove.pos1e:remove()
|
||||
mesecons_automove.pos1e = minetest.add_entity(mesecons_automove.pos1,"mesecons_automove:pos1")
|
||||
end
|
||||
if( mesecons_automove.pos2 ~= nil ) and (mesecons_automove.pos2e ~= nil ) then
|
||||
mesecons_automove.pos2e:remove()
|
||||
mesecons_automove.pos2e = minetest.add_entity(mesecons_automove.pos2,"mesecons_automove:pos2")
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
]]--
|
||||
|
||||
function radians_to_vectors(rad)
|
||||
local pi = math.pi
|
||||
if (rad>=0) and (rad<=pi/4) or (rad<=2*pi) and (rad>=(3/2+1/4)*pi) then
|
||||
return {left = {x=-1,z=0},right = { x=1, z = 0 } }
|
||||
elseif (rad >= 1/4*pi) and (rad <= (1/2+1/4)*pi) then
|
||||
return { left = {x = 0 ,z=-1}, right = { x = 0, z = 1 } }
|
||||
elseif (rad >= (1-1/4)*pi ) and (rad <= (3/2-1/4)*pi ) then
|
||||
return { left = { x = 1, z =0 }, right = { x = -1, z = 0 } }
|
||||
else
|
||||
return { left = { z =1, x = 0 } , right = { z = -1 , x = 0 }}
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
local function get_front_wall(pos1,pos2,direction)
|
||||
local y = pos1.y -- p1.y == p2.y
|
||||
local x,z
|
||||
local d= direction
|
||||
if d.x == -1 then
|
||||
local m = math.min(pos1.x,pos2.x)-1 -- aoutside the selection
|
||||
return {
|
||||
pos1 = { x = m, y = y, z = pos1.z},
|
||||
pos2 = { x = m, y = y, z = pos2.z},
|
||||
}
|
||||
elseif d.x == 1 then
|
||||
local m = math.max(pos1.x,pos2.x)+1 -- aoutside the selection
|
||||
return {
|
||||
pos1 = { x = m, y = y, z = pos1.z},
|
||||
pos2 = { x = m, y = y, z = pos2.z},
|
||||
}
|
||||
|
||||
elseif d.z == -1 then
|
||||
local m = math.min(pos1.z,pos2.z)-1 -- aoutside the selection
|
||||
return {
|
||||
pos1 = { x = pos1.x, y = y, z = m},
|
||||
pos2 = { x = pos2.x, y = y, z = m},
|
||||
}
|
||||
|
||||
else
|
||||
--if d.z == 1 then
|
||||
local m = math.max(pos1.z,pos2.z)+1 -- aoutside the selection
|
||||
return {
|
||||
pos1 = { x = pos1.x, y = y, z = m},
|
||||
pos2 = { x = pos2.x, y = y, z = m},
|
||||
}
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
local function get_back_wall(p1,p2,direction)
|
||||
local pos1,pos2 = sort_xz(p1,p2)
|
||||
local y = pos1.y -- p1.y == p2.y
|
||||
local x,z
|
||||
local d= direction
|
||||
if d.x == 1 then
|
||||
local m = math.min(pos1.x,pos2.x) -- aoutside the selection
|
||||
return {
|
||||
pos1 = { x = m, y = y, z = pos1.z},
|
||||
pos2 = { x = m, y = y, z = pos2.z},
|
||||
}
|
||||
elseif d.x == -1 then
|
||||
local m = math.max(pos1.x,pos2.x) -- aoutside the selection
|
||||
return {
|
||||
pos1 = { x = m, y = y, z = pos1.z},
|
||||
pos2 = { x = m, y = y, z = pos2.z},
|
||||
}
|
||||
|
||||
elseif d.z == 1 then
|
||||
local m = math.min(pos1.z,pos2.z) -- aoutside the selection
|
||||
return {
|
||||
pos1 = { x = pos1.x, y = y, z = m},
|
||||
pos2 = { x = pos2.x, y = y, z = m},
|
||||
}
|
||||
|
||||
else
|
||||
--if d.z == 1 then
|
||||
local m = math.max(pos1.z,pos2.z) -- aoutside the selection
|
||||
return {
|
||||
pos1 = { x = pos1.x, y = y, z = m},
|
||||
pos2 = { x = pos2.x, y = y, z = m},
|
||||
}
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
local function have_output(pos,direction)
|
||||
local neight_pos = { x = pos.x -direction.x, y = pos.y, z = pos.z - direction.z }
|
||||
local neight_pin = get_pins_sticky(neight_pos)
|
||||
|
||||
local pin = get_pins_sticky(pos)
|
||||
|
||||
|
||||
-- check if connected with each other
|
||||
if(direction.x == 1 ) then
|
||||
if not (( pin.l == 1 ) and (neight_pin.r == 1 ) ) then return false end
|
||||
elseif( direction.x == -1 ) then
|
||||
if not ( (pin.r == 1) and (neight_pin.l == 1) ) then return false end
|
||||
elseif( direction.z == 1 ) then
|
||||
if not (( pin.d == 1 ) and (neight_pin.u == 1 ) ) then return false end
|
||||
else
|
||||
if not ((pin.u == 1) and (neight_pin.d == 1 )) then return false end
|
||||
end
|
||||
|
||||
print("debug.pin="..dump(pos))
|
||||
if( pin.u == 1 ) and (direction.z == -1 ) then return true end
|
||||
if( pin.d == 1 ) and (direction.z == 1 ) then return true end
|
||||
if( pin.l == 1 ) and (direction.x == 1 ) then return true end
|
||||
if( pin.r == 1 ) and (direction.x == -1 ) then return true end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
|
||||
local function get_outputs(wall,direction)
|
||||
local pos1 = wall.pos1
|
||||
local pos2 = wall.pos2
|
||||
|
||||
local list = {}
|
||||
if pos1.x == pos2.x then
|
||||
local f = math.min(pos1.z, pos2.z)
|
||||
local t = math.max(pos1.z, pos2.z)
|
||||
for i=f,t do
|
||||
local posi = { y = pos1.y, x = pos1.x , z = i }
|
||||
if( have_output( posi , direction ) == true ) then
|
||||
table.insert(list,posi)
|
||||
end
|
||||
end
|
||||
else
|
||||
-- pos1.z == pos2.z
|
||||
local f = math.min(pos1.x, pos2.x)
|
||||
local t = math.max(pos1.x, pos2.x)
|
||||
for i=f,t do
|
||||
local posi = { y = pos1.y, z = pos1.z , x = i }
|
||||
if( have_output( posi , direction ) == true ) then
|
||||
table.insert(list,posi)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
print("DEBUG.list = "..dump(list))
|
||||
return list
|
||||
end
|
||||
|
||||
|
||||
-- callback fun(pos)
|
||||
local function foreach_wall(wall,fun)
|
||||
local pos1 = wall.pos1
|
||||
local pos2 = wall.pos2
|
||||
|
||||
if pos1.x == pos2.x then
|
||||
local f = math.min(pos1.z, pos2.z)
|
||||
local t = math.max(pos1.z, pos2.z)
|
||||
for i=f,t do
|
||||
local posi = { y = pos1.y, x = pos1.x , z = i }
|
||||
fun(posi)
|
||||
end
|
||||
else
|
||||
-- pos1.z == pos2.z
|
||||
local f = math.min(pos1.x, pos2.x)
|
||||
local t = math.max(pos1.x, pos2.x)
|
||||
for i=f,t do
|
||||
local posi = { y = pos1.y, z = pos1.z , x = i }
|
||||
fun(posi)
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local function move_single_node(pos,direction)
|
||||
local node = minetest.get_node(pos)
|
||||
minetest.set_node(pos, { name = "air" } )
|
||||
local new_pos = { x = pos.x + direction.x,y = pos.y ,z = pos.z + direction.z }
|
||||
put_node(new_pos,node)
|
||||
end
|
||||
|
||||
|
||||
local function move_nodes(direction)
|
||||
local pos1 = mesecons_automove.pos1
|
||||
local pos2 = mesecons_automove.pos2
|
||||
|
||||
|
||||
-- needed later
|
||||
local back_wall = get_back_wall(pos1,pos2,direction)
|
||||
local outputs = get_outputs(back_wall,direction)
|
||||
|
||||
|
||||
|
||||
-- removes front wall
|
||||
local wall = get_front_wall(pos1,pos2,direction)
|
||||
foreach_wall(wall, function(pos) minetest.set_node(pos,{name="air"}) end )
|
||||
|
||||
-- moves each "colum" from the front to end
|
||||
local xf, xt, xd , zf, zt, zd
|
||||
|
||||
if( direction.x == 1 ) then
|
||||
xt = math.min(pos1.x, pos2.x)
|
||||
xf = math.max(pos1.x, pos2.x)
|
||||
zf = math.min(pos1.z, pos2.z)
|
||||
zt = math.max(pos1.z, pos2.z)
|
||||
xd = -1
|
||||
zd = 1
|
||||
elseif(direction.x == -1 ) then
|
||||
xf = math.min(pos1.x, pos2.x)
|
||||
xt = math.max(pos1.x, pos2.x)
|
||||
zf = math.min(pos1.z, pos2.z)
|
||||
zt = math.max(pos1.z, pos2.z)
|
||||
xd = 1
|
||||
zd = 1
|
||||
|
||||
elseif(direction.z == 1 ) then
|
||||
xf = math.min(pos1.x, pos2.x)
|
||||
xt = math.max(pos1.x, pos2.x)
|
||||
zt = math.min(pos1.z, pos2.z)
|
||||
zf = math.max(pos1.z, pos2.z)
|
||||
xd = 1
|
||||
zd = -1
|
||||
|
||||
else -- direction.z == -1
|
||||
xf = math.min(pos1.x, pos2.x)
|
||||
xt = math.max(pos1.x, pos2.x)
|
||||
zf = math.min(pos1.z, pos2.z)
|
||||
zt = math.max(pos1.z, pos2.z)
|
||||
xd = 1
|
||||
zd = 1
|
||||
end
|
||||
|
||||
for ix = xf,xt,xd do
|
||||
for iz = zf,zt,zd do
|
||||
-- print("move("..ix..","..iz..")")
|
||||
local current = { x = ix, y=pos1.y , z = iz }
|
||||
move_single_node(current,direction)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- adding wires at the end
|
||||
|
||||
print("debug: back_wall =" ..dump(back_wall) .. ", outputs = ".. dump(outputs))
|
||||
for _,p in ipairs(outputs) do
|
||||
if( direction.z == 0 ) then
|
||||
-- x direction
|
||||
put_node_activate(p,{name = "mesecons_insulated:insulated_off", param2 = 0 } )
|
||||
else
|
||||
-- z direction
|
||||
put_node_activate(p,{name = "mesecons_insulated:insulated_off", param2 = 1 } )
|
||||
end
|
||||
end
|
||||
|
||||
-- activate front wall
|
||||
--TODO: refresh new value of wires
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
local function add_direction_to_pos(pos,direction)
|
||||
return {x = pos.x + direction.x, y= pos.y, z = pos.z + direction.z }
|
||||
end
|
||||
|
||||
local function can_move_node(pos,direction)
|
||||
local node = minetest.get_node(pos)
|
||||
local name = node.name
|
||||
local param2= node.param2
|
||||
|
||||
if( name == "air" ) then
|
||||
return true
|
||||
end
|
||||
if( name == "mesecons_insulated:insulated_off" ) or ( name == "mesecons_insulated:insulated_on" ) then
|
||||
if (param2==0) or (param2==2) then
|
||||
if( direction.z==0) then return true else return false end
|
||||
elseif (param2==1) or (param2==3) then
|
||||
if( direction.x == 0) then return true else return false end
|
||||
end
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
local function check_if_can_move(direction)
|
||||
local pos1 = mesecons_automove.pos1
|
||||
local pos2 = mesecons_automove.pos2
|
||||
|
||||
pos1,pos2 = sort_xz(pos1,pos2)
|
||||
local wall = get_front_wall(pos1,pos2,direction)
|
||||
|
||||
pos1 = wall.pos1
|
||||
pos2 = wall.pos2
|
||||
|
||||
local v
|
||||
if( pos1.x == pos2.x ) then
|
||||
if( pos1.z < pos2.z ) then
|
||||
v = {z=1,x=0}
|
||||
else
|
||||
v = {z=-1,x=0}
|
||||
end
|
||||
else
|
||||
-- pos1.z == pos2.z
|
||||
if( pos1.x < pos2.x ) then
|
||||
v = {z=0,x=1}
|
||||
else
|
||||
v ={ z=0,x=-1}
|
||||
end
|
||||
end
|
||||
|
||||
local current = pos1
|
||||
while( eq_pos(current,pos2) == false ) do
|
||||
if( can_move_node(current,direction) == false ) then
|
||||
return false
|
||||
end
|
||||
current.x = current.x + v.x
|
||||
current.z = current.z + v.z
|
||||
end
|
||||
-- do last node
|
||||
if( can_move_node(current,direction) == false ) then
|
||||
return false
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
|
||||
local function move_selection_left(rad)
|
||||
local v = radians_to_vectors(rad)
|
||||
local pos1 = mesecons_automove.pos1
|
||||
local pos2 = mesecons_automove.pos2
|
||||
if( pos1 == nil ) then return end
|
||||
if( pos2 == nil ) then return end
|
||||
|
||||
|
||||
|
||||
if( check_if_can_move(v.left) == false ) then return end
|
||||
move_nodes(v.left)
|
||||
|
||||
pos1.x = pos1.x + v.left.x
|
||||
pos1.z = pos1.z + v.left.z
|
||||
|
||||
pos2.x = pos2.x + v.left.x
|
||||
pos2.z = pos2.z + v.left.z
|
||||
|
||||
|
||||
mesecons_automove.pos1 = pos1
|
||||
mesecons_automove.pos2 = pos2
|
||||
update_selection()
|
||||
|
||||
|
||||
end
|
||||
|
||||
local function move_selection_right(rad)
|
||||
local v = radians_to_vectors(rad)
|
||||
|
||||
local pos1 = mesecons_automove.pos1
|
||||
local pos2 = mesecons_automove.pos2
|
||||
if( pos1 == nil ) then return end
|
||||
if( pos2 == nil ) then return end
|
||||
|
||||
|
||||
if( check_if_can_move(v.right) == false ) then return end
|
||||
move_nodes(v.right)
|
||||
|
||||
|
||||
pos1.x = pos1.x + v.right.x
|
||||
pos1.z = pos1.z + v.right.z
|
||||
|
||||
pos2.x = pos2.x + v.right.x
|
||||
pos2.z = pos2.z + v.right.z
|
||||
|
||||
|
||||
|
||||
mesecons_automove.pos1 = pos1
|
||||
mesecons_automove.pos2 = pos2
|
||||
update_selection()
|
||||
|
||||
|
||||
|
||||
end
|
||||
|
||||
|
||||
minetest.register_entity(":mesecons_automove:pos1", {
|
||||
initial_properties = {
|
||||
visual = "cube",
|
||||
visual_size = {x=1.1, y=1.1, },
|
||||
textures = {"worldedit_pos1.png", "worldedit_pos1.png",
|
||||
"worldedit_pos1.png", "worldedit_pos1.png",
|
||||
"worldedit_pos1.png", "worldedit_pos1.png"},
|
||||
collisionbox = {-0.55, -0.55, -0.55, 0.55, 0.55, 0.55},
|
||||
physical = false,
|
||||
static_save = false,
|
||||
},
|
||||
on_activate = function(self, staticdata, dtime_s)
|
||||
|
||||
end,
|
||||
on_punch = function(self, hitter)
|
||||
self.object:remove()
|
||||
mesecons_automove.pos1e = nil
|
||||
mesecons_automove.pos1 = nil
|
||||
mesecons_automove.pos2 = nil
|
||||
if( mesecons_automove.pos2e ~= nil ) then
|
||||
mesecons_automove.pos2e:remove()
|
||||
mesecons_automove.pos2e = nil
|
||||
end
|
||||
print("debug.self:remove()")
|
||||
end,
|
||||
on_blast = function(self, damage)
|
||||
return false, false, {} -- don't damage or knockback
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_entity(":mesecons_automove:pos2", {
|
||||
initial_properties = {
|
||||
visual = "cube",
|
||||
visual_size = {x=1.1, y=1.1},
|
||||
textures = {"worldedit_pos2.png", "worldedit_pos2.png",
|
||||
"worldedit_pos2.png", "worldedit_pos2.png",
|
||||
"worldedit_pos2.png", "worldedit_pos2.png"},
|
||||
collisionbox = {-0.55, -0.55, -0.55, 0.55, 0.55, 0.55},
|
||||
physical = false,
|
||||
static_save = false,
|
||||
},
|
||||
on_activate = function(self, staticdata, dtime_s)
|
||||
end,
|
||||
on_punch = function(self, hitter)
|
||||
self.object:remove()
|
||||
mesecons_automove.pos2e = nil
|
||||
mesecons_automove.pos2 = nil
|
||||
mesecons_automove.pos1 = nil
|
||||
if( mesecons_automove.pos1e ~= nil) then
|
||||
mesecons_automove.pos1e:remove()
|
||||
|
||||
end
|
||||
end,
|
||||
on_blast = function(self, damage)
|
||||
return false, false, {} -- don't damage or knockback
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_entity(":mesecons_automove:move_region", {
|
||||
initial_properties = {
|
||||
visual = "upright_sprite",
|
||||
textures = {"worldedit_cube.png"},
|
||||
visual_size = {x=10, y=1.1},
|
||||
physical = false,
|
||||
static_save = false,
|
||||
},
|
||||
on_activate = function(self, staticdata, dtime_s)
|
||||
end,
|
||||
on_punch = function(self, hitter)
|
||||
self.object:remove()
|
||||
end,
|
||||
on_blast = function(self, damage)
|
||||
return false, false, {} -- don't damage or knockback
|
||||
end,
|
||||
})
|
||||
|
||||
--minetest.register_craftitem("mesecons_autowire:move", {
|
||||
minetest.register_tool("mesecons_autowire:select", {
|
||||
description = "Tool Autoselect",
|
||||
inventory_image = "tool_autoselect.png",
|
||||
stack_max = 1,
|
||||
groups = { tool =1 },
|
||||
|
||||
|
||||
on_use = function(itemstack, user, pointed_thing)
|
||||
if pointed_thing == nil then return end
|
||||
if pointed_thing.type == "nothing" then
|
||||
--unselect
|
||||
mesecons_automove.pos1 = nil
|
||||
mesecons_automove.pos2 = nil
|
||||
update_selection()
|
||||
|
||||
return
|
||||
elseif pointed_thing.type == "node" then
|
||||
--select pos1
|
||||
local node_pos = pointed_thing.under
|
||||
if( mesecons_automove.pos1e ~= nil ) then
|
||||
mesecons_automove.pos1e:remove()
|
||||
end
|
||||
|
||||
if( is_circuit_element(node_pos) ) then
|
||||
mesecons_automove.pos1 = node_pos
|
||||
else
|
||||
mesecons_automove.pos1 = pointed_thing.above
|
||||
end
|
||||
mesecons_automove.pos1e = minetest.add_entity(mesecons_automove.pos1,"mesecons_automove:pos1")
|
||||
|
||||
end
|
||||
end,
|
||||
on_place = function(itemstack, user, pointed_thing)
|
||||
if pointed_thing == nil then return end
|
||||
if pointed_thing.type == "node" then
|
||||
local node_pos = pointed_thing.under
|
||||
|
||||
if( mesecons_automove.pos2e ~= nil ) then
|
||||
mesecons_automove.pos2e:remove()
|
||||
end
|
||||
|
||||
|
||||
if( is_circuit_element(node_pos) ) then
|
||||
mesecons_automove.pos2 = node_pos
|
||||
else
|
||||
mesecons_automove.pos2 = pointed_thing.above
|
||||
end
|
||||
mesecons_automove.pos2e = minetest.add_entity(mesecons_automove.pos2,"mesecons_automove:pos2")
|
||||
end
|
||||
end,
|
||||
|
||||
on_secondary_use = function(itemstack, user, pointed_thing)
|
||||
if pointed_thing == nil then return end
|
||||
if pointed_thing.type == "nothing" then
|
||||
--move
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
})
|
||||
|
||||
minetest.register_tool("mesecons_autowire:move", {
|
||||
description = "Tool Automove",
|
||||
inventory_image = "tool_automove.png",
|
||||
stack_max = 1,
|
||||
groups = { tool =1 },
|
||||
|
||||
|
||||
on_use = function(itemstack, user, pointed_thing)
|
||||
if mesecons_automove.pos1 == nil then return end
|
||||
if mesecons_automove.pos2 == nil then return end
|
||||
move_selection_left(user:get_look_horizontal())
|
||||
|
||||
|
||||
end,
|
||||
on_place = function(itemstack, user, pointed_thing)
|
||||
if mesecons_automove.pos1 == nil then return end
|
||||
if mesecons_automove.pos2 == nil then return end
|
||||
move_selection_right(user:get_look_horizontal())
|
||||
|
||||
end,
|
||||
|
||||
on_secondary_use = function(itemstack, user, pointed_thing)
|
||||
if mesecons_automove.pos1 == nil then return end
|
||||
if mesecons_automove.pos2 == nil then return end
|
||||
move_selection_right(user:get_look_horizontal())
|
||||
|
||||
end
|
||||
|
||||
|
||||
})
|
||||
|
@ -1,259 +0,0 @@
|
||||
mesecons_autowire.pos1 = nil
|
||||
mesecons_autowire.pos2 = nil
|
||||
|
||||
|
||||
-- a bit of a weld (TODO: fix that)
|
||||
function is_circuit_element(pos)
|
||||
local node = minetest.get_node(pos)
|
||||
local name = node.name
|
||||
|
||||
local m = string.match(name,"^mesecons_")
|
||||
if m ~= nil then
|
||||
return true
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local function put_node(pos,node)
|
||||
minetest.set_node(pos,node)
|
||||
mesecon.on_placenode(pos,node)
|
||||
end
|
||||
|
||||
|
||||
|
||||
function get_neigh_pins(p)
|
||||
return {
|
||||
u = get_pins_sticky( { x=p.x, y=p.y, z=p.z+1 } ).d,
|
||||
d = get_pins_sticky( { x=p.x, y=p.y, z=p.z-1 } ).u,
|
||||
l = get_pins_sticky( { x=p.x-1, y=p.y, z=p.z } ).r,
|
||||
r = get_pins_sticky( { x=p.x+1, y=p.y, z=p.z } ).l
|
||||
}
|
||||
end
|
||||
|
||||
|
||||
local map2 = {
|
||||
{{"mesecons_insulated:insulated_off",1}, {u=1,d=0,l=0,r=0}},
|
||||
{{"mesecons_insulated:insulated_off",1}, {u=0,d=1,l=0,r=0}},
|
||||
{{"mesecons_insulated:insulated_off",0}, {u=0,d=0,l=1,r=0}},
|
||||
{{"mesecons_insulated:insulated_off",0}, {u=0,d=0,l=0,r=1}},
|
||||
}
|
||||
|
||||
function pins_to_wire(pins)
|
||||
for _,v in ipairs(mesecons_autowire.map) do
|
||||
local p = v[2]
|
||||
local name = v[1][1]
|
||||
local param2 = v[1][2]
|
||||
if( eq_pins(p,pins) ) then
|
||||
return { name = name, param2 = param2 }
|
||||
end
|
||||
end
|
||||
|
||||
for _,v in ipairs(map2) do
|
||||
local p = v[2]
|
||||
local name = v[1][1]
|
||||
local param2 = v[1][2]
|
||||
|
||||
if( eq_pins(p,pins) ) then
|
||||
return { name = name, param2 = param2 }
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
return {name ="air" }
|
||||
end
|
||||
|
||||
|
||||
function merge(pos,direc)
|
||||
local node = minetest.get_node(pos)
|
||||
local name = node.name
|
||||
local param2 = node.param2
|
||||
|
||||
if( (not is_wire(pos)) and (not (name == "air") )) then return end
|
||||
|
||||
-- exception (dont change)
|
||||
if ( name == "mesecons_extrawires:crossover_off" ) or
|
||||
( name == "mesecons_extrawires:crossover_on") or
|
||||
( name == "mesecons_extrawires:crossover_10") or
|
||||
( name == "mesecons_extrawires:crossover_01")
|
||||
then
|
||||
return
|
||||
end
|
||||
-- end of exception
|
||||
|
||||
local pins = and_pins(get_pins(pos),get_neigh_pins(pos))
|
||||
local final_pins = or_pins(pins, direc_to_pin(direc))
|
||||
|
||||
|
||||
local node = pins_to_wire(final_pins)
|
||||
put_node(pos,node)
|
||||
end
|
||||
|
||||
function merge_start(pos,direction_from)
|
||||
merge(pos,direction_from)
|
||||
end
|
||||
|
||||
function merge_end(pos,direction_from)
|
||||
if( direction_from == "u" ) then
|
||||
merge(pos,"d")
|
||||
elseif( direction_from == "d" ) then
|
||||
merge(pos,"u")
|
||||
elseif( direction_from == "l" ) then
|
||||
merge(pos,"r")
|
||||
elseif( direction_from == "r" ) then
|
||||
merge(pos,"l")
|
||||
end
|
||||
end
|
||||
|
||||
function jump(pos,direc)
|
||||
local node = minetest.get_node(pos)
|
||||
local name = node.name
|
||||
local param2 = node.param2
|
||||
|
||||
if( name == "mesecons_insulated:insulated_off" or name == "mesecons_insulated:insulated_on" ) then
|
||||
if( direc == "u" or direc == "d" ) then
|
||||
if( param2 == 0 or param2 == 2 ) then
|
||||
put_node(pos, {name ="mesecons_extrawires:crossover_off"});
|
||||
elseif ( param2 == 1 or param2 == 3) then
|
||||
--nothing
|
||||
end
|
||||
elseif( direc == "l" or direc == "r" ) then
|
||||
if( param2 == 0 or param2 == 2 ) then
|
||||
--nothing
|
||||
elseif ( param2 == 1 or param2 == 3) then
|
||||
put_node(pos, {name ="mesecons_extrawires:crossover_off"});
|
||||
end
|
||||
end
|
||||
end
|
||||
if( name == "air" ) then
|
||||
if( direc == "u" or direc == "d" ) then
|
||||
put_node(pos, {name ="mesecons_insulated:insulated_off",param2=1});
|
||||
elseif( direc == "l" or direc == "r" ) then
|
||||
put_node(pos, {name ="mesecons_insulated:insulated_off",param2=0});
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
function next_pos(pos,direc)
|
||||
local p = pos
|
||||
if( direc == "u" ) then
|
||||
p.z = p.z + 1
|
||||
elseif( direc == "d" ) then
|
||||
p.z = p.z - 1
|
||||
elseif( direc == "l" ) then
|
||||
p.x = p.x -1
|
||||
elseif( direc == "r" ) then
|
||||
p.x = p.x + 1
|
||||
end
|
||||
return p
|
||||
end
|
||||
|
||||
function eq_pos(p1,p2)
|
||||
if( (p1.x==p2.x) and (p1.y==p2.y) and (p1.z==p2.z) ) then
|
||||
return true
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
function make_wire(p1,p2,direc)
|
||||
local current = p1
|
||||
|
||||
merge_start(current,direc)
|
||||
current = next_pos(current,direc)
|
||||
|
||||
while(not eq_pos(current,p2)) do
|
||||
jump(current,direc)
|
||||
current = next_pos(current,direc)
|
||||
end
|
||||
merge_end(current,direc)
|
||||
end
|
||||
|
||||
|
||||
|
||||
function do_work()
|
||||
if(not mesecons_autowire.pos1 ) then
|
||||
return false
|
||||
end
|
||||
if(not mesecons_autowire.pos2 ) then
|
||||
return false
|
||||
end
|
||||
|
||||
local pos1 = mesecons_autowire.pos1
|
||||
local pos2 = mesecons_autowire.pos2
|
||||
|
||||
if( pos1.y~=pos2.y) then
|
||||
return false
|
||||
end
|
||||
if( (pos1.x==pos2.x) and (pos1.z==pos2.z) ) then
|
||||
return false
|
||||
end
|
||||
|
||||
if( (pos1.x~=pos2.x) and (pos1.z~=pos2.z) ) then
|
||||
return false
|
||||
end
|
||||
|
||||
local direc = ""
|
||||
|
||||
if( pos1.z == pos2.z ) then
|
||||
if( pos1.x < pos2.x ) then
|
||||
direc = "r"
|
||||
else
|
||||
direc = "l"
|
||||
end
|
||||
elseif( pos1.x == pos2.x ) then
|
||||
if( pos1.z < pos2.z ) then
|
||||
direc = "u"
|
||||
else
|
||||
direc = "d"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
if( direc == "" ) then return end
|
||||
make_wire(pos1,pos2,direc)
|
||||
return true
|
||||
|
||||
end
|
||||
|
||||
minetest.register_craftitem("mesecons_autowire:wire", {
|
||||
description = "Tool Autowire",
|
||||
inventory_image = "tool_autowire.png",
|
||||
stack_max = 1,
|
||||
groups = { tool =1 },
|
||||
|
||||
on_use = function(itemstack, user, pointed_thing)
|
||||
|
||||
if pointed_thing.type ~= "node" then return end
|
||||
local node_pos = pointed_thing.under
|
||||
if( is_circuit_element(node_pos) ) then
|
||||
mesecons_autowire.pos1 = node_pos
|
||||
else
|
||||
mesecons_autowire.pos1 = pointed_thing.above
|
||||
end
|
||||
|
||||
|
||||
end,
|
||||
on_place = function(itemstack, user, pointed_thing)
|
||||
if not pointed_thing then return end
|
||||
if pointed_thing.type ~= "node" then return end
|
||||
local node_pos = pointed_thing.under
|
||||
if( is_circuit_element(node_pos) ) then
|
||||
mesecons_autowire.pos2 = node_pos
|
||||
else
|
||||
mesecons_autowire.pos2 = pointed_thing.above
|
||||
end
|
||||
if (do_work()) then
|
||||
|
||||
mesecons_autowire.pos1 = mesecons_autowire.pos2
|
||||
mesecons_autowire.pos2 = nil
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
})
|
||||
|
@ -1,769 +0,0 @@
|
||||
-- support for MT game translation.
|
||||
local S = default.get_translator
|
||||
|
||||
--[[
|
||||
current = pos left bottom
|
||||
posh = pos right bottom
|
||||
posv = pos left top
|
||||
depends where you look at
|
||||
]]--
|
||||
|
||||
local function standarise_corners(pos1,pos2,direction)
|
||||
--assert(pos1.y == pos2.y) TODO: how to solve the problem of selectin not flat region
|
||||
|
||||
local x1,x2,z1,z2,y
|
||||
y = pos1.y
|
||||
|
||||
x1 = pos1.x
|
||||
x2 = pos2.x
|
||||
z1 = pos1.z
|
||||
z2 = pos2.z
|
||||
|
||||
x1,x2 = math.min(x1,x2), math.max(x1,x2)
|
||||
z1,z2 = math.min(z1,z2), math.max(z1,z2)
|
||||
|
||||
local p1,p2,p3,p4
|
||||
|
||||
p1 = { x=x1,y=y,z=z1 }
|
||||
p2 = { x=x2,y=y,z=z1 }
|
||||
p3 = { x=x1,y=y,z=z2 }
|
||||
p4 = { x=x2,y=y,z=z2 }
|
||||
|
||||
if( direction.x == -1 ) then
|
||||
return p2,p4,p1
|
||||
elseif( direction.x == 1 ) then
|
||||
return p3,p1,p4
|
||||
elseif( direction.z == -1 ) then
|
||||
return p4,p3,p2
|
||||
else
|
||||
return p1,p2,p3
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
local function iter_vectors(direction)
|
||||
local dx = direction.x
|
||||
local dz = direction.z
|
||||
|
||||
if( direction.z == 1 ) then
|
||||
return {x=1,z=0},{x=0,z=1}
|
||||
elseif( direction.z == -1 ) then
|
||||
return {x=-1,z=0},{x=0,z=-1}
|
||||
elseif( direction.x == -1 ) then
|
||||
return {x=0,z=1},{x=-1,z=0}
|
||||
else
|
||||
return {x=0,z=-1},{x=1,z=0}
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
function check_selection(pos1,pos2)
|
||||
if( pos1 == nil ) then return false end
|
||||
if( pos2 == nil ) then return false end
|
||||
return true
|
||||
end
|
||||
|
||||
local function add_direct_to_pos(pos,direc)
|
||||
return { x = pos.x + direc.x , y = pos.y, z = pos.z + direc.z }
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
local function store_nodes(p1,p2,direction)
|
||||
|
||||
local pos1,pos2 = p1,p2
|
||||
local tab = {}
|
||||
|
||||
if( check_selection(pos1,pos2) == false ) then
|
||||
return nil
|
||||
end
|
||||
local corner, maxh, maxv = standarise_corners(pos1,pos2,direction)
|
||||
local inch,incv = iter_vectors(direction)
|
||||
|
||||
|
||||
local i,k = 1,1
|
||||
|
||||
local cur,curv,curh = corner,corner,corner
|
||||
|
||||
while true do
|
||||
i = 1
|
||||
tab[k] = {}
|
||||
while true do
|
||||
tab[k][i] = minetest.get_node(cur)
|
||||
if( eq_pos(curh,maxh) ) then
|
||||
break
|
||||
end
|
||||
curh = add_direct_to_pos(curh,inch)
|
||||
cur = add_direct_to_pos(cur, inch)
|
||||
i = i + 1
|
||||
end
|
||||
|
||||
if( eq_pos(curv,maxv) ) then
|
||||
break
|
||||
end
|
||||
curv = add_direct_to_pos(curv,incv)
|
||||
cur = curv
|
||||
curh = corner
|
||||
k = k +1
|
||||
end
|
||||
|
||||
--print("["..i.."]["..k.."]="..name)
|
||||
--print("table = ".. dump(tab))
|
||||
return tab
|
||||
|
||||
end
|
||||
|
||||
local function radians_to_direction_looking_forward(rad)
|
||||
if rad == nil then return {x=1,z=0} end
|
||||
local pi = math.pi
|
||||
if (rad>=0) and (rad<=pi/4) or (rad<=2*pi) and (rad>=(3/2+1/4)*pi) then
|
||||
return {x=0, z =1 }
|
||||
elseif (rad >= 1/4*pi) and (rad <= (1/2+1/4)*pi) then
|
||||
return {x=-1,z=0}
|
||||
elseif (rad >= (1-1/4)*pi ) and (rad <= (3/2-1/4)*pi ) then
|
||||
return {x=0,z=-1}
|
||||
else
|
||||
return {x=1,z=0}
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local function store_nodes_from_selection(rad)
|
||||
|
||||
local direction = radians_to_direction_looking_forward(rad)
|
||||
return store_nodes(mesecons_automove.pos1, mesecons_automove.pos2,direction)
|
||||
end
|
||||
|
||||
|
||||
|
||||
local function circuit_on_place(itemstack, user, pointed_thing)
|
||||
print("debug:on_plalce_circuit")
|
||||
end
|
||||
|
||||
|
||||
|
||||
local max_text_size = 10000
|
||||
local max_title_size = 80
|
||||
local short_title_size = 35
|
||||
|
||||
|
||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
if formname ~= "mesecons_autowire:circuit" then return end
|
||||
|
||||
if( fields.save) then
|
||||
local stack = player:get_wielded_item()
|
||||
local inv = player:get_inventory()
|
||||
local new_stack = nil
|
||||
local meta = stack:get_meta()
|
||||
local data = meta:to_table().fields
|
||||
|
||||
if data == nil then data = {} end
|
||||
data.title = fields.title or ""
|
||||
|
||||
|
||||
|
||||
-- if no nodes then save nodes
|
||||
local nodes = minetest.deserialize(data.nodes)
|
||||
|
||||
--if not data.nodes then
|
||||
if nodes == nil then
|
||||
local rad = player:get_look_horizontal()
|
||||
local tab = store_nodes_from_selection(rad)
|
||||
--print("tab="..dump(tab))
|
||||
if( tab ) then
|
||||
data.nodes = minetest.serialize(tab)
|
||||
data.rad = rad
|
||||
else
|
||||
return
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
-- print("debug.af="..dump(data))
|
||||
|
||||
if( stack:get_name() == "mesecons_autowire:circuit_full" ) then
|
||||
|
||||
elseif ( stack:get_name() == "mesecons_autowire:circuit_empty" ) then
|
||||
local count = stack:get_count()
|
||||
if( count <= 0 ) then return end
|
||||
print("debug.count="..count)
|
||||
if count == 1 then
|
||||
--inv:remove_item("main",stack)
|
||||
stack:set_name("mesecons_autowire:circuit_full")
|
||||
else
|
||||
stack:set_count(count - 1)
|
||||
print("debug.count*="..stack:get_count() )
|
||||
new_stack = ItemStack("mesecons_autowire:circuit_full")
|
||||
end
|
||||
else
|
||||
end
|
||||
|
||||
|
||||
|
||||
if not fields.text then fields.text = "" end
|
||||
if not fields.title then fields.title = "" end
|
||||
|
||||
data.title = fields.title:sub(1, max_title_size)
|
||||
local short_title = data.title
|
||||
-- Don't bother triming the title if the trailing dots would make it longer
|
||||
if #short_title > short_title_size + 3 then
|
||||
short_title = short_title:sub(1, short_title_size) .. "..."
|
||||
end
|
||||
data.description = S(short_title)
|
||||
data.text = fields.text:sub(1, max_text_size)
|
||||
data.text = data.text:gsub("\r\n", "\n"):gsub("\r", "\n")
|
||||
|
||||
|
||||
if new_stack then
|
||||
|
||||
new_stack:get_meta():from_table({ fields = data})
|
||||
|
||||
if inv:room_for_item("main", new_stack) then
|
||||
inv:add_item("main", new_stack)
|
||||
else
|
||||
minetest.add_item(player:get_pos(), new_stack)
|
||||
end
|
||||
else
|
||||
print("debug.new_stack==nil")
|
||||
stack:get_meta():from_table( {fields = data } )
|
||||
end
|
||||
|
||||
|
||||
|
||||
--debug
|
||||
|
||||
|
||||
player:set_wielded_item(stack)
|
||||
|
||||
end
|
||||
end)
|
||||
|
||||
|
||||
|
||||
local function direction_to_number(direction)
|
||||
if( direction.z == 1 ) then
|
||||
return 1
|
||||
elseif( direction.x == 1 ) then
|
||||
return 2
|
||||
elseif(direction.z == -1 )then
|
||||
return 3
|
||||
else
|
||||
return 4
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
local rotate_exceptions = {
|
||||
"mesecons_extrawires:crossover_off",
|
||||
"mesecons_extrawires:crossover_on",
|
||||
"mesecons_morewires:xjunction_on",
|
||||
"mesecons_morewires:xjunction_off"
|
||||
}
|
||||
|
||||
local function is_exception(node)
|
||||
for _,v in ipairs(rotate_exceptions) do
|
||||
if( v == node.name ) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
local function node_to_image(node)
|
||||
if node == nil then
|
||||
return "unknown.png"
|
||||
end
|
||||
|
||||
local name = node.name
|
||||
local param2 = node.param2 or 0
|
||||
|
||||
|
||||
if( name == "air" ) then
|
||||
return "empty.png"
|
||||
end
|
||||
|
||||
|
||||
if (name == "mesecons_insulated:insulated_off") or
|
||||
(name == "mesecons_insulated:insulated_on" ) then
|
||||
if( param2 % 2 == 0 ) then
|
||||
return "wireh.png"
|
||||
else
|
||||
return "wirev.png"
|
||||
end
|
||||
end
|
||||
|
||||
if (name == "mesecons_extrawires:crossover_off") or
|
||||
(name == "mesecons_extrawires:crossover_on") or
|
||||
(name == "mesecons_extrawires:crossover_01") or
|
||||
(name == "mesecons_extrawires:crossover_10" ) then
|
||||
return "corssover.png"
|
||||
end
|
||||
|
||||
if (name == "mesecons_extrawires:corner_off" ) or
|
||||
(name == "mesecons_extrawires:corner_on" ) then
|
||||
|
||||
return "corner"..param2 .. ".png"
|
||||
end
|
||||
|
||||
if (name == "mesecons_extrawires:tjunction_off" ) or
|
||||
(name == "mesecons_extrawires:tjunction_on" ) then
|
||||
|
||||
return "tjunction"..param2 .. ".png"
|
||||
end
|
||||
|
||||
if ( name == "mesecons_morewires:xjunction_off" ) or
|
||||
( name == "mesecons_morewires:xjunction_on" ) then
|
||||
return "xjunction.png"
|
||||
end
|
||||
|
||||
|
||||
if( name == "mesecons_regs:flipflop_off" ) or ( name == "mesecons_regs:flipflop_on") then
|
||||
return "ff"..param2..".png"
|
||||
end
|
||||
if( name == "mesecons_regs:latch_off" ) or ( name == "mesecons_regs:latch_on") then
|
||||
return "latch"..param2..".png"
|
||||
end
|
||||
|
||||
|
||||
if( name == "mesecons_gates:and_off" ) or ( name =="mesecons_gates:and_on" )then
|
||||
return "and".. param2 .. ".png"
|
||||
end
|
||||
if( name == "mesecons_gates:nand_off" ) or ( name =="mesecons_gates:nand_on" )then
|
||||
return "nand".. param2 .. ".png"
|
||||
end
|
||||
|
||||
if( name == "mesecons_gates:nor_off" ) or ( name =="mesecons_gates:nor_on" )then
|
||||
return "nor".. param2 .. ".png"
|
||||
end
|
||||
if( name == "mesecons_gates:or_off" ) or ( name =="mesecons_gates:or_on" )then
|
||||
return "or".. param2 .. ".png"
|
||||
end
|
||||
if( name == "mesecons_gates:xor_off" ) or ( name =="mesecons_gates:xor_on" )then
|
||||
return "xor".. param2 .. ".png"
|
||||
end
|
||||
|
||||
|
||||
if( name == "mesecons_gates:diode_off" ) or ( name =="mesecons_gates:diode_on" )then
|
||||
return "diode".. param2 .. ".png"
|
||||
end
|
||||
|
||||
if( name == "mesecons_gates:not_off" ) or ( name =="mesecons_gates:not_on" )then
|
||||
return "not".. param2 .. ".png"
|
||||
end
|
||||
|
||||
|
||||
|
||||
return "unknown.png"
|
||||
|
||||
end
|
||||
|
||||
|
||||
local function generate_spec(starting,nodes)
|
||||
if nodes == nil then
|
||||
return ""
|
||||
end
|
||||
|
||||
local mv = #nodes
|
||||
local mh = #nodes[1]
|
||||
|
||||
|
||||
|
||||
|
||||
local str = ""
|
||||
local x,z
|
||||
|
||||
for x = 1,mh do
|
||||
for z = 1,mv do
|
||||
local img = node_to_image(nodes[z][x])
|
||||
|
||||
--str = str .. "image[" .. 0.5*x .. "," .. 0.5*(mv-z+1) ..
|
||||
str = str .. "image[" .. x +starting .. "," .. (mv-z+1) ..
|
||||
";1,1;"..img.."]"
|
||||
--";0.5,0.5;"..img.."]"
|
||||
end
|
||||
end
|
||||
return str
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
local function special_case(node,rotate)
|
||||
local new_node = node
|
||||
local applied = false
|
||||
if( node.name == "mesecons_extrawires:crossover_10") and (rotate % 2 == 1 ) then
|
||||
new_node.name = "mesecons_extrawires:crossover_01"
|
||||
new_node.param2 = 0
|
||||
return new_node
|
||||
elseif (node.name == "mesecons_extrawires:crossover_10") and (rotate % 2 == 0 ) then
|
||||
new_node.name = "mesecons_extrawires:crossover_10"
|
||||
new_node.param2 = 0
|
||||
return new_node
|
||||
elseif( node.name == "mesecons_extrawires:crossover_01" and (rotate % 2 == 1) ) then
|
||||
new_node.name = "mesecons_extrawires:crossover_10"
|
||||
new_node.param2 = 0
|
||||
return new_node
|
||||
elseif ( node.name == "mesecons_extrawires:crossover_01" and (rotate % 2 == 0 ) ) then
|
||||
new_node.name = "mesecons_extrawires:crossover_01"
|
||||
new_node.param2 = 0
|
||||
return new_node
|
||||
end
|
||||
|
||||
return nil
|
||||
end
|
||||
local function rotate_node(node, saved_direction,direction)
|
||||
if( is_exception(node) ) then return node end
|
||||
|
||||
local values =
|
||||
{
|
||||
{0,1,2,3},
|
||||
{3,0,1,2},
|
||||
{2,3,0,1},
|
||||
{1,2,3,0}
|
||||
}
|
||||
|
||||
local rotate =
|
||||
values[direction_to_number(saved_direction)][direction_to_number(direction)]
|
||||
|
||||
local new_node = special_case(node,rotate)
|
||||
if( new_node ~= nil ) then return new_node end
|
||||
|
||||
|
||||
new_node = node
|
||||
new_node.param2 = (node.param2+rotate)%4
|
||||
return new_node
|
||||
end
|
||||
|
||||
local function rotate_nodes_for_window(nodes, oryginal)
|
||||
if nodes == nil then return nil end
|
||||
local mv = #nodes
|
||||
local mh = #nodes[1]
|
||||
local dir = {x=0,z=1}
|
||||
|
||||
local tab = {}
|
||||
for k = 1,mv do
|
||||
tab[k] = {}
|
||||
for i = 1,mh do
|
||||
tab[k][i] = rotate_node(nodes[k][i],oryginal,dir)
|
||||
end
|
||||
end
|
||||
return tab
|
||||
|
||||
end
|
||||
|
||||
function is_gate(node)
|
||||
local gates = {
|
||||
"mesecons_gates:and",
|
||||
"mesecons_gates:or",
|
||||
"mesecons_gates:xor",
|
||||
"mesecons_gates:nand",
|
||||
"mesecons_gates:nor",
|
||||
"mesecons_gates:not",
|
||||
"mesecons_gates:diode",
|
||||
"mesecons_gates3:and3",
|
||||
"mesecons_gates3:or3",
|
||||
"mesecons_gates3:nor3",
|
||||
"mesecons_gates3:nand3",
|
||||
"mesecons_regs:flipflop",
|
||||
"mesecons_regs:latch"
|
||||
}
|
||||
|
||||
local gates_with_states = {}
|
||||
for _,v in ipairs(gates) do
|
||||
table.insert(gates_with_states,v.."_on")
|
||||
table.insert(gates_with_states,v.."_off")
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
for _,v in ipairs(gates_with_states) do
|
||||
if node.name == v then
|
||||
print("found.gate="..v)
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
return false
|
||||
|
||||
|
||||
end
|
||||
|
||||
|
||||
local function count_stats(tab)
|
||||
if tab == nil then return 0 end
|
||||
local block, wire, gate = 0,0,0
|
||||
|
||||
local h,v = #tab[1], #tab
|
||||
for i = 1,h do
|
||||
for k = 1,v do
|
||||
if tab[k][i].name ~= "air" then
|
||||
block = block + 1
|
||||
end
|
||||
if is_wire_node(tab[k][i]) then
|
||||
wire = wire + 1
|
||||
end
|
||||
if is_gate(tab[k][i]) then
|
||||
gate = gate + 1
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
end
|
||||
end
|
||||
return block, wire, gate
|
||||
end
|
||||
|
||||
|
||||
local function show_dialog(itemstack,user,pointed_thing)
|
||||
local player_name = user:get_player_name()
|
||||
local formspec
|
||||
local esc = minetest.formspec_escape
|
||||
|
||||
|
||||
local meta = itemstack:get_meta()
|
||||
local data = meta:to_table().fields
|
||||
local title, text = data.title or "", data.text or ""
|
||||
|
||||
|
||||
|
||||
local nodes_string = "empty"
|
||||
local nodes = minetest.deserialize(data.nodes)
|
||||
local hight = 0
|
||||
local width = 0
|
||||
if( nodes ) then
|
||||
-- show nodes
|
||||
nodes_string = "size = (".. #nodes[1] .. ","..#nodes .. ")"
|
||||
hight = #nodes
|
||||
width = #nodes[1]
|
||||
end
|
||||
|
||||
|
||||
if( nodes == nil ) and
|
||||
( check_selection(mesecons_automove.pos1,mesecons_automove.pos2) == false ) then
|
||||
return
|
||||
end
|
||||
|
||||
if nodes == nil then
|
||||
local rad = user:get_look_horizontal()
|
||||
local tab = store_nodes_from_selection(rad)
|
||||
if tab == nil then return end
|
||||
nodes = tab
|
||||
data.rad = rad
|
||||
hight = #nodes
|
||||
width = #nodes[1]
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
local size_w = 45
|
||||
size_w = width + 10
|
||||
if( size_w < 20 ) then size_w = 20 end
|
||||
if( size_w > 45 ) then size_w = 45 end
|
||||
local size_scroll = size_w - 10
|
||||
|
||||
local starting_point = math.max(0, (size_scroll/2) - (width/2))
|
||||
|
||||
|
||||
local block,wire,gate = count_stats(nodes)
|
||||
local stats = "size : " .. width .. "x"..hight .. "(=".. width * hight .. ")\n" ..
|
||||
"wires : " .. wire .. "\n" ..
|
||||
"gates : " .. gate .. "\n" ..
|
||||
"other : ".. block - wire - gate .. "\n" ..
|
||||
"blocks: " .. block
|
||||
|
||||
|
||||
local circuitspec =
|
||||
generate_spec(starting_point,
|
||||
rotate_nodes_for_window(
|
||||
nodes,
|
||||
radians_to_direction_looking_forward(
|
||||
tonumber(data.rad))))
|
||||
|
||||
formspec =
|
||||
"formspec_version[3]"..
|
||||
--"size[45,25]" ..
|
||||
"size[".. size_w .. ",25]"..
|
||||
"field[0.5,1;8,1;title;"..S("Name")..";"..S(title).."]"..
|
||||
"textarea[0.5,3;8,15;text;" .. esc(S("Description:")) .. ";" ..
|
||||
esc(S(text)) .. "]" ..
|
||||
"button_exit[2.5,18;3,1;save;" .. esc(S("Save")) .. "]" ..
|
||||
"textarea[0.5,19;8,5;;;" ..
|
||||
esc(S(stats)) .. "]" ..
|
||||
--"label[10,0.5;"..nodes_string.."]"..
|
||||
--"container[8,0.5]"..
|
||||
"scrollbaroptions[min=0;max=".. hight -15 .. ";smallstep=2;largestep=10;arrows=show]"..
|
||||
|
||||
--"scrollbar[44,0.5;0.6,24;vertical;scr0;0]"..
|
||||
"scrollbar[".. size_w - 1 .. ",0.5;0.6,24;vertical;scr0;0]"..
|
||||
|
||||
--"scroll_container[8,0.5;36,23;scr0;vertical;1]"..
|
||||
"scroll_container[8,0.5;".. size_w -10 .. ",23;scr0;vertical;1]"..
|
||||
circuitspec ..
|
||||
|
||||
"scroll_container_end[]"..
|
||||
--"container_end[]"..
|
||||
|
||||
""
|
||||
minetest.show_formspec(player_name, "mesecons_autowire:circuit", formspec)
|
||||
return itemstack
|
||||
end
|
||||
|
||||
|
||||
|
||||
local function make_selection(nodes,pos,rad)
|
||||
|
||||
if nodes == nil then return end
|
||||
--if check_selection(mesecons_automove.pos1,mesecons_automove.pos2) == false then return end
|
||||
|
||||
local vsize = #nodes
|
||||
local hsize = #nodes[1]
|
||||
|
||||
-- print("dump"..dump(nodes) .. "====" .. dump(pos) .. "===" .. vsize .. "=" .. hsize )
|
||||
|
||||
local direction = radians_to_direction_looking_forward(rad)
|
||||
|
||||
mesecons_automove.pos1 = pos
|
||||
|
||||
local dx,dz = 0,0
|
||||
|
||||
--print("dumpsirection="..dump(direction))
|
||||
hsize = hsize -1
|
||||
vsize = vsize -1
|
||||
if direction.z == 1 then
|
||||
dx,dz = hsize,vsize
|
||||
elseif direction.z == -1 then
|
||||
dx,dz = -hsize,-vsize
|
||||
elseif direction.x == 1 then
|
||||
dx,dz = vsize,-hsize
|
||||
else
|
||||
--dirextion.x == -1
|
||||
dx,dz = -vsize,hsize
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
mesecons_automove.pos2 = { x=pos.x + dx, y=pos.y, z = pos.z+dz }
|
||||
mesecons_automove.rad = rad
|
||||
|
||||
--print("debug.all="..dump(mesecons_automove))
|
||||
update_selection()
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
local function paste_nodes(nodes,saved_direction,direction)
|
||||
local pos1,pos2 = mesecons_automove.pos1,mesecons_automove.pos2
|
||||
|
||||
if( check_selection(pos1,pos2) == false ) then
|
||||
return nil
|
||||
end
|
||||
local corner, maxh, maxv = standarise_corners(pos1,pos2,direction)
|
||||
local inch,incv = iter_vectors(direction)
|
||||
|
||||
local tab = nodes
|
||||
if tab == nil then return end
|
||||
local maxi = #nodes[1]
|
||||
local maxk = #nodes
|
||||
|
||||
local i,k = 1,1
|
||||
|
||||
local cur,curv,curh = corner,corner,corner
|
||||
|
||||
while true do
|
||||
i = 1
|
||||
while true do
|
||||
--tab[k][i] = minetest.get_node(cur)
|
||||
if( i<=maxi) and (k<=maxk) then
|
||||
local n = rotate_node(tab[k][i],saved_direction,direction)
|
||||
minetest.set_node(cur,n)
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if( eq_pos(curh,maxh) ) then
|
||||
break
|
||||
end
|
||||
curh = add_direct_to_pos(curh,inch)
|
||||
cur = add_direct_to_pos(cur, inch)
|
||||
i = i + 1
|
||||
end
|
||||
|
||||
if( eq_pos(curv,maxv) ) then
|
||||
break
|
||||
end
|
||||
curv = add_direct_to_pos(curv,incv)
|
||||
cur = curv
|
||||
curh = corner
|
||||
k = k +1
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
local function on_use_circuit(itemstack, user, pointed_thing)
|
||||
if( pointed_thing.type == "node" ) then
|
||||
-- select region
|
||||
local nodes = minetest.deserialize(itemstack:get_meta():to_table().fields.nodes)
|
||||
|
||||
local sel_pos
|
||||
if( is_circuit_element(pointed_thing.under) ) then
|
||||
sel_pos = pointed_thing.under
|
||||
else
|
||||
sel_pos = pointed_thing.above
|
||||
end
|
||||
|
||||
make_selection(nodes,sel_pos,user:get_look_horizontal())
|
||||
else
|
||||
-- show dialog
|
||||
show_dialog(itemstack,user,pointed_thing);
|
||||
end
|
||||
end
|
||||
|
||||
local function on_place_circuit(itemstack, user, pointed_thing)
|
||||
if pointed_thing.type == "node" then
|
||||
-- paste
|
||||
|
||||
end
|
||||
|
||||
if( mesecons_automove.rad == nil ) then return end
|
||||
local data = itemstack:get_meta():to_table()
|
||||
local nodes = minetest.deserialize(data.fields.nodes)
|
||||
local rad = tonumber( data.fields.rad )
|
||||
paste_nodes(nodes,radians_to_direction_looking_forward(rad), radians_to_direction_looking_forward(mesecons_automove.rad))
|
||||
end
|
||||
|
||||
|
||||
minetest.register_craftitem("mesecons_autowire:circuit_empty", {
|
||||
description = S("Circuit empty"),
|
||||
inventory_image = "circuit_empty.png",
|
||||
|
||||
on_use = on_use_circuit
|
||||
|
||||
})
|
||||
|
||||
minetest.register_craftitem("mesecons_autowire:circuit_full", {
|
||||
description = S("Circuit saved"),
|
||||
inventory_image = "circuit_full.png",
|
||||
groups = {not_in_creative_inventory = 1},
|
||||
stack_max = 1,
|
||||
on_use = on_use_circuit,
|
||||
on_place = on_place_circuit,
|
||||
on_secondary_use = on_place_circuit
|
||||
|
||||
|
||||
})
|
@ -1,6 +0,0 @@
|
||||
mesecons_autowire = {}
|
||||
dofile(minetest.get_modpath("mesecons_autowire").."/utils.lua");
|
||||
dofile(minetest.get_modpath("mesecons_autowire").."/auto_delete.lua");
|
||||
dofile(minetest.get_modpath("mesecons_autowire").."/auto_wire.lua");
|
||||
dofile(minetest.get_modpath("mesecons_autowire").."/auto_move.lua");
|
||||
dofile(minetest.get_modpath("mesecons_autowire").."/circuit.lua");
|
@ -1,4 +0,0 @@
|
||||
author = marek
|
||||
description = Adds tools for automatic wire placing.
|
||||
name = mesecons_autowire
|
||||
depends = mesecons, mesecons_morewires
|
@ -1,71 +0,0 @@
|
||||
|
||||
|
||||
|
||||
local function on_use_page(itemstack, user, pointed_thing)
|
||||
local player_name = user:get_player_name()
|
||||
local esc = minetest.formspec_escape
|
||||
|
||||
|
||||
local meta = itemstack:get_meta():to_table()
|
||||
print("itemstack:meta()="..dump(meta))
|
||||
|
||||
minetest.create_detached_inventory("slots")
|
||||
local inv = minetest.create_detached_inventory("inventory_name", {
|
||||
allow_move = function(inv, from_list, from_index, to_list, to_index, count, player)
|
||||
return count -- allow moving
|
||||
end,
|
||||
|
||||
allow_put = function(inv, listname, index, stack, player)
|
||||
return stack:get_count() -- allow putting
|
||||
end,
|
||||
|
||||
allow_take = function(inv, listname, index, stack, player)
|
||||
return -1 -- don't allow taking
|
||||
end,
|
||||
|
||||
on_put = function(inv, listname, index, stack, player)
|
||||
minetest.chat_send_all(player:get_player_name() ..
|
||||
" gave " .. stack:to_string() ..
|
||||
" to the donation chest from " .. minetest.pos_to_string(player:get_pos()))
|
||||
end,
|
||||
})
|
||||
|
||||
local formspec = "size[10,8]" ..
|
||||
"list[detached:inventory_name;main;0.5,0;8,4]"..
|
||||
"list[current_player;main;0,3;8,4]"..
|
||||
""
|
||||
|
||||
local stack = ItemStack("default:dirt 7")
|
||||
inv:set_size("main",8)
|
||||
inv:add_item("main",stack)
|
||||
|
||||
|
||||
minetest.show_formspec(player_name,"mesecons_autowire:page", formspec)
|
||||
|
||||
|
||||
end
|
||||
|
||||
|
||||
minetest.register_craftitem("mesecons_autowire:page_empty", {
|
||||
description = "Circuit Page empty",
|
||||
--inventory_image = "circuit_empty.png",
|
||||
inventory_image = "page_empty.png",
|
||||
--groups = {book = 1, flammable = 3},
|
||||
|
||||
on_use = on_use_page
|
||||
|
||||
})
|
||||
|
||||
minetest.register_craftitem("mesecons_autowire:page_full", {
|
||||
description = "Circuit page saved",
|
||||
--inventory_image = "circuit_full.png",
|
||||
inventory_image = "page_full.png",
|
||||
--groups = {book = 1, not_in_creative_inventory = 1, flammable = 3},
|
||||
groups = { not_in_creative_inventory = 1},
|
||||
stack_max = 1,
|
||||
--on_use = on_use_circuit,
|
||||
--on_place = on_place_circuit,
|
||||
--on_secondary_use = on_place_circuit
|
||||
|
||||
|
||||
})
|
Before Width: | Height: | Size: 178 B |
Before Width: | Height: | Size: 177 B |
Before Width: | Height: | Size: 179 B |
Before Width: | Height: | Size: 176 B |
Before Width: | Height: | Size: 257 B |
Before Width: | Height: | Size: 315 B |
Before Width: | Height: | Size: 142 B |
Before Width: | Height: | Size: 144 B |
Before Width: | Height: | Size: 146 B |
Before Width: | Height: | Size: 137 B |
Before Width: | Height: | Size: 160 B |
Before Width: | Height: | Size: 181 B |
Before Width: | Height: | Size: 179 B |
Before Width: | Height: | Size: 181 B |
Before Width: | Height: | Size: 178 B |
Before Width: | Height: | Size: 123 B |
Before Width: | Height: | Size: 188 B |
Before Width: | Height: | Size: 192 B |
Before Width: | Height: | Size: 188 B |
Before Width: | Height: | Size: 190 B |
Before Width: | Height: | Size: 181 B |
Before Width: | Height: | Size: 184 B |
Before Width: | Height: | Size: 184 B |
Before Width: | Height: | Size: 183 B |
Before Width: | Height: | Size: 180 B |
Before Width: | Height: | Size: 180 B |
Before Width: | Height: | Size: 180 B |
Before Width: | Height: | Size: 179 B |
Before Width: | Height: | Size: 180 B |
Before Width: | Height: | Size: 183 B |
Before Width: | Height: | Size: 180 B |
Before Width: | Height: | Size: 183 B |
Before Width: | Height: | Size: 181 B |
Before Width: | Height: | Size: 179 B |
Before Width: | Height: | Size: 181 B |
Before Width: | Height: | Size: 178 B |
Before Width: | Height: | Size: 182 B |
Before Width: | Height: | Size: 182 B |
Before Width: | Height: | Size: 182 B |
Before Width: | Height: | Size: 182 B |
Before Width: | Height: | Size: 334 KiB |
Before Width: | Height: | Size: 142 B |
Before Width: | Height: | Size: 145 B |
Before Width: | Height: | Size: 144 B |
Before Width: | Height: | Size: 143 B |
Before Width: | Height: | Size: 228 B |
Before Width: | Height: | Size: 249 B |
Before Width: | Height: | Size: 236 B |
Before Width: | Height: | Size: 249 B |
Before Width: | Height: | Size: 223 B |
Before Width: | Height: | Size: 201 B |
Before Width: | Height: | Size: 130 B |
Before Width: | Height: | Size: 134 B |
Before Width: | Height: | Size: 147 B |
Before Width: | Height: | Size: 142 B |
Before Width: | Height: | Size: 157 B |
Before Width: | Height: | Size: 170 B |
Before Width: | Height: | Size: 184 B |
Before Width: | Height: | Size: 186 B |
Before Width: | Height: | Size: 183 B |
Before Width: | Height: | Size: 187 B |
@ -1,331 +0,0 @@
|
||||
|
||||
function dump(o)
|
||||
if type(o) == 'table' then
|
||||
local s = '{ '
|
||||
for k,v in pairs(o) do
|
||||
if type(k) ~= 'number' then k = '"'..k..'"' end
|
||||
s = s .. '['..k..'] = ' .. dump(v) .. ','
|
||||
end
|
||||
return s .. '} '
|
||||
else
|
||||
return tostring(o)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
function is_wire_node(node)
|
||||
local list = {
|
||||
"mesecons_insulated:insulated_off", "mesecons_insulated:insulated_on",
|
||||
"mesecons_extrawires:corner_off", "mesecons_extrawires:corner_on",
|
||||
"mesecons_extrawires:tjunction_off", "mesecons_extrawires:tjunction_on",
|
||||
"mesecons_extrawires:crossover_off", "mesecons_extrawires:crossover_on",
|
||||
"mesecons_extrawires:crossover_10", "mesecons_extrawires:crossover_01",
|
||||
"mesecons_morewires:xjunction_off", "mesecons_morewires:xjunction_on",
|
||||
}
|
||||
|
||||
local pos_name = node.name
|
||||
for i,name in ipairs(list) do
|
||||
if name == pos_name then
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
|
||||
function is_wire(pos)
|
||||
local list = {
|
||||
"mesecons_insulated:insulated_off", "mesecons_insulated:insulated_on",
|
||||
"mesecons_extrawires:corner_off", "mesecons_extrawires:corner_on",
|
||||
"mesecons_extrawires:tjunction_off", "mesecons_extrawires:tjunction_on",
|
||||
"mesecons_extrawires:crossover_off", "mesecons_extrawires:crossover_on",
|
||||
"mesecons_extrawires:crossover_10", "mesecons_extrawires:crossover_01",
|
||||
"mesecons_morewires:xjunction_off", "mesecons_morewires:xjunction_on",
|
||||
}
|
||||
|
||||
local node = minetest.get_node(pos)
|
||||
local pos_name = node.name
|
||||
for i,name in ipairs(list) do
|
||||
if name == pos_name then
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
|
||||
|
||||
function up_node(pos)
|
||||
return { x = pos.x, y = pos.y, z=pos.z+1}
|
||||
end
|
||||
function down_node(pos)
|
||||
return { x = pos.x, y = pos.y, z=pos.z-1}
|
||||
end
|
||||
function left_node(pos)
|
||||
return {x=pos.x-1,y=pos.y,z=pos.z}
|
||||
end
|
||||
function right_node(pos)
|
||||
return {x=pos.x+1,y=pos.y,z=pos.z}
|
||||
end
|
||||
|
||||
|
||||
mesecons_autowire.map = {
|
||||
-- beware, order is important, I think, not sure though
|
||||
|
||||
{{"air", 0 }, { u=0, d=0, l=0, r=0 }},
|
||||
|
||||
|
||||
{{"mesecons_insulated:insulated_off",0}, {u=0,d=0,l=1,r=1}},
|
||||
{{"mesecons_insulated:insulated_off",2}, {u=0,d=0,l=1,r=1}},
|
||||
{{"mesecons_insulated:insulated_off",1}, {u=1,d=1,l=0,r=0}},
|
||||
{{"mesecons_insulated:insulated_off",3}, {u=1,d=1,l=0,r=0}},
|
||||
|
||||
{{"mesecons_extrawires:corner_off",0}, {u=0,d=1,l=1,r=0}},
|
||||
{{"mesecons_extrawires:corner_off",1}, {u=1,d=0,l=1,r=0}},
|
||||
{{"mesecons_extrawires:corner_off",2}, {u=1,d=0,l=0,r=1}},
|
||||
{{"mesecons_extrawires:corner_off",3}, {u=0,d=1,l=0,r=1}},
|
||||
|
||||
{{"mesecons_insulated:insulated_on",0}, {u=0,d=0,l=1,r=1}},
|
||||
{{"mesecons_insulated:insulated_on",2}, {u=0,d=0,l=1,r=1}},
|
||||
{{"mesecons_insulated:insulated_on",1}, {u=1,d=1,l=0,r=0}},
|
||||
{{"mesecons_insulated:insulated_on",3}, {u=1,d=1,l=0,r=0}},
|
||||
|
||||
{{"mesecons_extrawires:corner_on",0}, {u=0,d=1,l=1,r=0}},
|
||||
{{"mesecons_extrawires:corner_on",1}, {u=1,d=0,l=1,r=0}},
|
||||
{{"mesecons_extrawires:corner_on",2}, {u=1,d=0,l=0,r=1}},
|
||||
{{"mesecons_extrawires:corner_on",3}, {u=0,d=1,l=0,r=1}},
|
||||
|
||||
|
||||
|
||||
|
||||
{{"mesecons_morewires:xjunction_off",0}, {u=1,d=1,l=1,r=1}},
|
||||
{{"mesecons_morewires:xjunction_on",0}, {u=1,d=1,l=1,r=1}},
|
||||
|
||||
{{"mesecons_extrawires:crossover_off",0}, {u=1,d=1,l=1,r=1}},
|
||||
{{"mesecons_extrawires:crossover_10",0}, {u=1,d=1,l=1,r=1}},
|
||||
{{"mesecons_extrawires:crossover_01",0}, {u=1,d=1,l=1,r=1}},
|
||||
{{"mesecons_extrawires:crossover_on",0}, {u=1,d=1,l=1,r=1}},
|
||||
|
||||
|
||||
{{"mesecons_extrawires:tjunction_off",0}, {u=0,d=1,l=1,r=1}},
|
||||
{{"mesecons_extrawires:tjunction_off",1}, {u=1,d=1,l=1,r=0}},
|
||||
{{"mesecons_extrawires:tjunction_off",2}, {u=1,d=0,l=1,r=1}},
|
||||
{{"mesecons_extrawires:tjunction_off",3}, {u=1,d=1,l=0,r=1}},
|
||||
|
||||
{{"mesecons_extrawires:tjunction_on",0}, {u=0,d=1,l=1,r=1}},
|
||||
{{"mesecons_extrawires:tjunction_on",1}, {u=1,d=1,l=1,r=0}},
|
||||
{{"mesecons_extrawires:tjunction_on",2}, {u=1,d=0,l=1,r=1}},
|
||||
{{"mesecons_extrawires:tjunction_on",3}, {u=1,d=1,l=0,r=1}},
|
||||
}
|
||||
|
||||
mesecons_autowire.mapsticky = {}
|
||||
|
||||
function is_sticky(pos)
|
||||
local node = minetest.get_node(pos)
|
||||
local name = node.name
|
||||
for i,v in ipairs(mesecons_autowire.mapsticky) do
|
||||
local name = v[1][1]
|
||||
local param2 = v[1][2]
|
||||
local pins = v[2]
|
||||
|
||||
if( (name == node.name) ) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
|
||||
|
||||
end
|
||||
|
||||
|
||||
function rotate_pin(p)
|
||||
return { u = p.l, r = p.u, d = p.r, l = p.d }
|
||||
end
|
||||
|
||||
function rotate_pins(p,r)
|
||||
local cur = p
|
||||
local i = 0
|
||||
while( i< r) do
|
||||
cur = rotate_pin(cur)
|
||||
i = i +1
|
||||
end
|
||||
return cur
|
||||
end
|
||||
|
||||
function map_add_gates()
|
||||
local gates = { "and", "or", "xor", "nand", "nor"}
|
||||
local states = { "on", "off" }
|
||||
local mod = "mesecons_gates"
|
||||
local pin = {u=1,d=1,r=1,l=0}
|
||||
|
||||
for _,g in ipairs(gates) do
|
||||
for r=0,3 do
|
||||
for _,s in ipairs(states) do
|
||||
local name = mod..":"..g.."_"..s
|
||||
|
||||
table.insert(mesecons_autowire.mapsticky, { { name, r}, rotate_pins(pin,r) })
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
gates = { "not", "diode" }
|
||||
pin = {u=0,d=0,l=1,r=1}
|
||||
|
||||
for _,g in ipairs(gates) do
|
||||
for r=0,3 do
|
||||
for _,s in ipairs(states) do
|
||||
local name = mod..":"..g.."_"..s
|
||||
|
||||
table.insert(mesecons_autowire.mapsticky, { { name, r}, rotate_pins(pin,r) })
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
gates = { "latch", "flipflop" }
|
||||
mod = "mesecons_regs"
|
||||
pin = { u=0,d=1,l=1,r=1 }
|
||||
|
||||
for _,g in ipairs(gates) do
|
||||
for r=0,3 do
|
||||
for _,s in ipairs(states) do
|
||||
local name = mod..":"..g.."_"..s
|
||||
|
||||
table.insert(mesecons_autowire.mapsticky, { { name, r}, rotate_pins(pin,r) })
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
gates = { "and3", "or3", "nand3", "nor3" }
|
||||
mod = "mesecons_gates3"
|
||||
pin = { u=1,d=1,l=1,r=1 }
|
||||
|
||||
for _,g in ipairs(gates) do
|
||||
for r=0,3 do
|
||||
for _,s in ipairs(states) do
|
||||
local name = mod..":"..g.."_"..s
|
||||
|
||||
table.insert(mesecons_autowire.mapsticky, { { name, r}, rotate_pins(pin,r) })
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
|
||||
map_add_gates()
|
||||
|
||||
|
||||
function get_pins_sticky(pos)
|
||||
local node = minetest.get_node(pos)
|
||||
for i,v in ipairs(mesecons_autowire.map) do
|
||||
local name = v[1][1]
|
||||
local param2 = v[1][2]
|
||||
local pins = v[2]
|
||||
|
||||
if( (name == node.name) and (node.param2 == param2) ) then
|
||||
return pins
|
||||
end
|
||||
end
|
||||
for i,v in ipairs(mesecons_autowire.mapsticky) do
|
||||
local name = v[1][1]
|
||||
local param2 = v[1][2]
|
||||
local pins = v[2]
|
||||
|
||||
if( (name == node.name) and (node.param2 == param2) ) then
|
||||
return pins
|
||||
end
|
||||
end
|
||||
return {u=0,d=0,l=0,r=0}
|
||||
end
|
||||
|
||||
|
||||
|
||||
function get_pins(pos)
|
||||
local node = minetest.get_node(pos)
|
||||
for i,v in ipairs(mesecons_autowire.map) do
|
||||
local name = v[1][1]
|
||||
local param2 = v[1][2]
|
||||
local pins = v[2]
|
||||
|
||||
if( (name == node.name) and (node.param2 == param2) ) then
|
||||
return pins
|
||||
end
|
||||
end
|
||||
return {u=0,d=0,l=0,r=0}
|
||||
end
|
||||
|
||||
|
||||
|
||||
function eq_pins(i1,i2)
|
||||
if i1.u ~= i2.u then return false end
|
||||
if i1.d ~= i2.d then return false end
|
||||
if i1.l ~= i2.l then return false end
|
||||
if i1.r ~= i2.r then return false end
|
||||
return true
|
||||
end
|
||||
|
||||
function and_pins(i1,i2)
|
||||
local u,d,l,r = 0,0,0,0
|
||||
if (i1.u==1) and (i2.u==1) then
|
||||
u = 1
|
||||
end
|
||||
if (i1.d==1) and (i2.d==1) then
|
||||
d = 1
|
||||
end
|
||||
if (i1.l==1) and (i2.l==1) then
|
||||
l =1
|
||||
end
|
||||
if(i1.r==1) and (i2.r==1) then
|
||||
r=1
|
||||
end
|
||||
return { u=u,d=d,l=l,r=r }
|
||||
end
|
||||
|
||||
function or_pins(i1,i2)
|
||||
local u,d,l,r = 0,0,0,0
|
||||
if (i1.u==1) or (i2.u==1) then
|
||||
u = 1
|
||||
end
|
||||
if (i1.d==1) or (i2.d==1) then
|
||||
d = 1
|
||||
end
|
||||
if (i1.l==1) or (i2.l==1) then
|
||||
l =1
|
||||
end
|
||||
if(i1.r==1) or (i2.r==1) then
|
||||
r=1
|
||||
end
|
||||
return { u=u,d=d,l=l,r=r }
|
||||
end
|
||||
|
||||
function direc_to_pin(dir)
|
||||
local u,d,l,r = 0,0,0,0
|
||||
if( dir == "u" ) then u = 1; end
|
||||
if( dir == "d" ) then d = 1; end
|
||||
if( dir == "l" ) then l = 1; end
|
||||
if( dir == "r" ) then r = 1; end
|
||||
return {u=u,d=d,l=l,r=r}
|
||||
end
|
||||
|
||||
function next_pos(pos,direc)
|
||||
local p = pos
|
||||
if( direc == "u" ) then
|
||||
p.z = p.z + 1
|
||||
elseif( direc == "d" ) then
|
||||
p.z = p.z - 1
|
||||
elseif( direc == "l" ) then
|
||||
p.x = p.x -1
|
||||
elseif( direc == "r" ) then
|
||||
p.x = p.x + 1
|
||||
end
|
||||
return p
|
||||
end
|
||||
|
||||
function eq_pos(p1,p2)
|
||||
if( (p1.x==p2.x) and (p1.y==p2.y) and (p1.z==p2.z) ) then
|
||||
return true
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
@ -1,532 +0,0 @@
|
||||
The LGPLv3 applies to all code in this project.
|
||||
The CC-BY-SA-3.0 license applies to textures and any other content in this project which is not source code.
|
||||
|
||||
=================================================================
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
|
||||
This version of the GNU Lesser General Public License incorporates
|
||||
the terms and conditions of version 3 of the GNU General Public
|
||||
License, supplemented by the additional permissions listed below.
|
||||
|
||||
0. Additional Definitions.
|
||||
|
||||
As used herein, "this License" refers to version 3 of the GNU Lesser
|
||||
General Public License, and the "GNU GPL" refers to version 3 of the GNU
|
||||
General Public License.
|
||||
|
||||
"The Library" refers to a covered work governed by this License,
|
||||
other than an Application or a Combined Work as defined below.
|
||||
|
||||
An "Application" is any work that makes use of an interface provided
|
||||
by the Library, but which is not otherwise based on the Library.
|
||||
Defining a subclass of a class defined by the Library is deemed a mode
|
||||
of using an interface provided by the Library.
|
||||
|
||||
A "Combined Work" is a work produced by combining or linking an
|
||||
Application with the Library. The particular version of the Library
|
||||
with which the Combined Work was made is also called the "Linked
|
||||
Version".
|
||||
|
||||
The "Minimal Corresponding Source" for a Combined Work means the
|
||||
Corresponding Source for the Combined Work, excluding any source code
|
||||
for portions of the Combined Work that, considered in isolation, are
|
||||
based on the Application, and not on the Linked Version.
|
||||
|
||||
The "Corresponding Application Code" for a Combined Work means the
|
||||
object code and/or source code for the Application, including any data
|
||||
and utility programs needed for reproducing the Combined Work from the
|
||||
Application, but excluding the System Libraries of the Combined Work.
|
||||
|
||||
1. Exception to Section 3 of the GNU GPL.
|
||||
|
||||
You may convey a covered work under sections 3 and 4 of this License
|
||||
without being bound by section 3 of the GNU GPL.
|
||||
|
||||
2. Conveying Modified Versions.
|
||||
|
||||
If you modify a copy of the Library, and, in your modifications, a
|
||||
facility refers to a function or data to be supplied by an Application
|
||||
that uses the facility (other than as an argument passed when the
|
||||
facility is invoked), then you may convey a copy of the modified
|
||||
version:
|
||||
|
||||
a) under this License, provided that you make a good faith effort to
|
||||
ensure that, in the event an Application does not supply the
|
||||
function or data, the facility still operates, and performs
|
||||
whatever part of its purpose remains meaningful, or
|
||||
|
||||
b) under the GNU GPL, with none of the additional permissions of
|
||||
this License applicable to that copy.
|
||||
|
||||
3. Object Code Incorporating Material from Library Header Files.
|
||||
|
||||
The object code form of an Application may incorporate material from
|
||||
a header file that is part of the Library. You may convey such object
|
||||
code under terms of your choice, provided that, if the incorporated
|
||||
material is not limited to numerical parameters, data structure
|
||||
layouts and accessors, or small macros, inline functions and templates
|
||||
(ten or fewer lines in length), you do both of the following:
|
||||
|
||||
a) Give prominent notice with each copy of the object code that the
|
||||
Library is used in it and that the Library and its use are
|
||||
covered by this License.
|
||||
|
||||
b) Accompany the object code with a copy of the GNU GPL and this license
|
||||
document.
|
||||
|
||||
4. Combined Works.
|
||||
|
||||
You may convey a Combined Work under terms of your choice that,
|
||||
taken together, effectively do not restrict modification of the
|
||||
portions of the Library contained in the Combined Work and reverse
|
||||
engineering for debugging such modifications, if you also do each of
|
||||
the following:
|
||||
|
||||
a) Give prominent notice with each copy of the Combined Work that
|
||||
the Library is used in it and that the Library and its use are
|
||||
covered by this License.
|
||||
|
||||
b) Accompany the Combined Work with a copy of the GNU GPL and this license
|
||||
document.
|
||||
|
||||
c) For a Combined Work that displays copyright notices during
|
||||
execution, include the copyright notice for the Library among
|
||||
these notices, as well as a reference directing the user to the
|
||||
copies of the GNU GPL and this license document.
|
||||
|
||||
d) Do one of the following:
|
||||
|
||||
0) Convey the Minimal Corresponding Source under the terms of this
|
||||
License, and the Corresponding Application Code in a form
|
||||
suitable for, and under terms that permit, the user to
|
||||
recombine or relink the Application with a modified version of
|
||||
the Linked Version to produce a modified Combined Work, in the
|
||||
manner specified by section 6 of the GNU GPL for conveying
|
||||
Corresponding Source.
|
||||
|
||||
1) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (a) uses at run time
|
||||
a copy of the Library already present on the user's computer
|
||||
system, and (b) will operate properly with a modified version
|
||||
of the Library that is interface-compatible with the Linked
|
||||
Version.
|
||||
|
||||
e) Provide Installation Information, but only if you would otherwise
|
||||
be required to provide such information under section 6 of the
|
||||
GNU GPL, and only to the extent that such information is
|
||||
necessary to install and execute a modified version of the
|
||||
Combined Work produced by recombining or relinking the
|
||||
Application with a modified version of the Linked Version. (If
|
||||
you use option 4d0, the Installation Information must accompany
|
||||
the Minimal Corresponding Source and Corresponding Application
|
||||
Code. If you use option 4d1, you must provide the Installation
|
||||
Information in the manner specified by section 6 of the GNU GPL
|
||||
for conveying Corresponding Source.)
|
||||
|
||||
5. Combined Libraries.
|
||||
|
||||
You may place library facilities that are a work based on the
|
||||
Library side by side in a single library together with other library
|
||||
facilities that are not Applications and are not covered by this
|
||||
License, and convey such a combined library under terms of your
|
||||
choice, if you do both of the following:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work based
|
||||
on the Library, uncombined with any other library facilities,
|
||||
conveyed under the terms of this License.
|
||||
|
||||
b) Give prominent notice with the combined library that part of it
|
||||
is a work based on the Library, and explaining where to find the
|
||||
accompanying uncombined form of the same work.
|
||||
|
||||
6. Revised Versions of the GNU Lesser General Public License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions
|
||||
of the GNU Lesser General Public License from time to time. Such new
|
||||
versions will be similar in spirit to the present version, but may
|
||||
differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Library as you received it specifies that a certain numbered version
|
||||
of the GNU Lesser General Public License "or any later version"
|
||||
applies to it, you have the option of following the terms and
|
||||
conditions either of that published version or of any later version
|
||||
published by the Free Software Foundation. If the Library as you
|
||||
received it does not specify a version number of the GNU Lesser
|
||||
General Public License, you may choose any version of the GNU Lesser
|
||||
General Public License ever published by the Free Software Foundation.
|
||||
|
||||
If the Library as you received it specifies that a proxy can decide
|
||||
whether future versions of the GNU Lesser General Public License shall
|
||||
apply, that proxy's public statement of acceptance of any version is
|
||||
permanent authorization for you to choose that version for the
|
||||
Library.
|
||||
|
||||
=================================================================
|
||||
|
||||
Creative Commons Legal Code
|
||||
|
||||
Attribution-ShareAlike 3.0 Unported
|
||||
|
||||
CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
|
||||
LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN
|
||||
ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
|
||||
INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
|
||||
REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR
|
||||
DAMAGES RESULTING FROM ITS USE.
|
||||
|
||||
License
|
||||
|
||||
THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
|
||||
COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
|
||||
COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
|
||||
AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
|
||||
|
||||
BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE
|
||||
TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY
|
||||
BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS
|
||||
CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND
|
||||
CONDITIONS.
|
||||
|
||||
1. Definitions
|
||||
|
||||
a. "Adaptation" means a work based upon the Work, or upon the Work and
|
||||
other pre-existing works, such as a translation, adaptation,
|
||||
derivative work, arrangement of music or other alterations of a
|
||||
literary or artistic work, or phonogram or performance and includes
|
||||
cinematographic adaptations or any other form in which the Work may be
|
||||
recast, transformed, or adapted including in any form recognizably
|
||||
derived from the original, except that a work that constitutes a
|
||||
Collection will not be considered an Adaptation for the purpose of
|
||||
this License. For the avoidance of doubt, where the Work is a musical
|
||||
work, performance or phonogram, the synchronization of the Work in
|
||||
timed-relation with a moving image ("synching") will be considered an
|
||||
Adaptation for the purpose of this License.
|
||||
b. "Collection" means a collection of literary or artistic works, such as
|
||||
encyclopedias and anthologies, or performances, phonograms or
|
||||
broadcasts, or other works or subject matter other than works listed
|
||||
in Section 1(f) below, which, by reason of the selection and
|
||||
arrangement of their contents, constitute intellectual creations, in
|
||||
which the Work is included in its entirety in unmodified form along
|
||||
with one or more other contributions, each constituting separate and
|
||||
independent works in themselves, which together are assembled into a
|
||||
collective whole. A work that constitutes a Collection will not be
|
||||
considered an Adaptation (as defined below) for the purposes of this
|
||||
License.
|
||||
c. "Creative Commons Compatible License" means a license that is listed
|
||||
at http://creativecommons.org/compatiblelicenses that has been
|
||||
approved by Creative Commons as being essentially equivalent to this
|
||||
License, including, at a minimum, because that license: (i) contains
|
||||
terms that have the same purpose, meaning and effect as the License
|
||||
Elements of this License; and, (ii) explicitly permits the relicensing
|
||||
of adaptations of works made available under that license under this
|
||||
License or a Creative Commons jurisdiction license with the same
|
||||
License Elements as this License.
|
||||
d. "Distribute" means to make available to the public the original and
|
||||
copies of the Work or Adaptation, as appropriate, through sale or
|
||||
other transfer of ownership.
|
||||
e. "License Elements" means the following high-level license attributes
|
||||
as selected by Licensor and indicated in the title of this License:
|
||||
Attribution, ShareAlike.
|
||||
f. "Licensor" means the individual, individuals, entity or entities that
|
||||
offer(s) the Work under the terms of this License.
|
||||
g. "Original Author" means, in the case of a literary or artistic work,
|
||||
the individual, individuals, entity or entities who created the Work
|
||||
or if no individual or entity can be identified, the publisher; and in
|
||||
addition (i) in the case of a performance the actors, singers,
|
||||
musicians, dancers, and other persons who act, sing, deliver, declaim,
|
||||
play in, interpret or otherwise perform literary or artistic works or
|
||||
expressions of folklore; (ii) in the case of a phonogram the producer
|
||||
being the person or legal entity who first fixes the sounds of a
|
||||
performance or other sounds; and, (iii) in the case of broadcasts, the
|
||||
organization that transmits the broadcast.
|
||||
h. "Work" means the literary and/or artistic work offered under the terms
|
||||
of this License including without limitation any production in the
|
||||
literary, scientific and artistic domain, whatever may be the mode or
|
||||
form of its expression including digital form, such as a book,
|
||||
pamphlet and other writing; a lecture, address, sermon or other work
|
||||
of the same nature; a dramatic or dramatico-musical work; a
|
||||
choreographic work or entertainment in dumb show; a musical
|
||||
composition with or without words; a cinematographic work to which are
|
||||
assimilated works expressed by a process analogous to cinematography;
|
||||
a work of drawing, painting, architecture, sculpture, engraving or
|
||||
lithography; a photographic work to which are assimilated works
|
||||
expressed by a process analogous to photography; a work of applied
|
||||
art; an illustration, map, plan, sketch or three-dimensional work
|
||||
relative to geography, topography, architecture or science; a
|
||||
performance; a broadcast; a phonogram; a compilation of data to the
|
||||
extent it is protected as a copyrightable work; or a work performed by
|
||||
a variety or circus performer to the extent it is not otherwise
|
||||
considered a literary or artistic work.
|
||||
i. "You" means an individual or entity exercising rights under this
|
||||
License who has not previously violated the terms of this License with
|
||||
respect to the Work, or who has received express permission from the
|
||||
Licensor to exercise rights under this License despite a previous
|
||||
violation.
|
||||
j. "Publicly Perform" means to perform public recitations of the Work and
|
||||
to communicate to the public those public recitations, by any means or
|
||||
process, including by wire or wireless means or public digital
|
||||
performances; to make available to the public Works in such a way that
|
||||
members of the public may access these Works from a place and at a
|
||||
place individually chosen by them; to perform the Work to the public
|
||||
by any means or process and the communication to the public of the
|
||||
performances of the Work, including by public digital performance; to
|
||||
broadcast and rebroadcast the Work by any means including signs,
|
||||
sounds or images.
|
||||
k. "Reproduce" means to make copies of the Work by any means including
|
||||
without limitation by sound or visual recordings and the right of
|
||||
fixation and reproducing fixations of the Work, including storage of a
|
||||
protected performance or phonogram in digital form or other electronic
|
||||
medium.
|
||||
|
||||
2. Fair Dealing Rights. Nothing in this License is intended to reduce,
|
||||
limit, or restrict any uses free from copyright or rights arising from
|
||||
limitations or exceptions that are provided for in connection with the
|
||||
copyright protection under copyright law or other applicable laws.
|
||||
|
||||
3. License Grant. Subject to the terms and conditions of this License,
|
||||
Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
|
||||
perpetual (for the duration of the applicable copyright) license to
|
||||
exercise the rights in the Work as stated below:
|
||||
|
||||
a. to Reproduce the Work, to incorporate the Work into one or more
|
||||
Collections, and to Reproduce the Work as incorporated in the
|
||||
Collections;
|
||||
b. to create and Reproduce Adaptations provided that any such Adaptation,
|
||||
including any translation in any medium, takes reasonable steps to
|
||||
clearly label, demarcate or otherwise identify that changes were made
|
||||
to the original Work. For example, a translation could be marked "The
|
||||
original work was translated from English to Spanish," or a
|
||||
modification could indicate "The original work has been modified.";
|
||||
c. to Distribute and Publicly Perform the Work including as incorporated
|
||||
in Collections; and,
|
||||
d. to Distribute and Publicly Perform Adaptations.
|
||||
e. For the avoidance of doubt:
|
||||
|
||||
i. Non-waivable Compulsory License Schemes. In those jurisdictions in
|
||||
which the right to collect royalties through any statutory or
|
||||
compulsory licensing scheme cannot be waived, the Licensor
|
||||
reserves the exclusive right to collect such royalties for any
|
||||
exercise by You of the rights granted under this License;
|
||||
ii. Waivable Compulsory License Schemes. In those jurisdictions in
|
||||
which the right to collect royalties through any statutory or
|
||||
compulsory licensing scheme can be waived, the Licensor waives the
|
||||
exclusive right to collect such royalties for any exercise by You
|
||||
of the rights granted under this License; and,
|
||||
iii. Voluntary License Schemes. The Licensor waives the right to
|
||||
collect royalties, whether individually or, in the event that the
|
||||
Licensor is a member of a collecting society that administers
|
||||
voluntary licensing schemes, via that society, from any exercise
|
||||
by You of the rights granted under this License.
|
||||
|
||||
The above rights may be exercised in all media and formats whether now
|
||||
known or hereafter devised. The above rights include the right to make
|
||||
such modifications as are technically necessary to exercise the rights in
|
||||
other media and formats. Subject to Section 8(f), all rights not expressly
|
||||
granted by Licensor are hereby reserved.
|
||||
|
||||
4. Restrictions. The license granted in Section 3 above is expressly made
|
||||
subject to and limited by the following restrictions:
|
||||
|
||||
a. You may Distribute or Publicly Perform the Work only under the terms
|
||||
of this License. You must include a copy of, or the Uniform Resource
|
||||
Identifier (URI) for, this License with every copy of the Work You
|
||||
Distribute or Publicly Perform. You may not offer or impose any terms
|
||||
on the Work that restrict the terms of this License or the ability of
|
||||
the recipient of the Work to exercise the rights granted to that
|
||||
recipient under the terms of the License. You may not sublicense the
|
||||
Work. You must keep intact all notices that refer to this License and
|
||||
to the disclaimer of warranties with every copy of the Work You
|
||||
Distribute or Publicly Perform. When You Distribute or Publicly
|
||||
Perform the Work, You may not impose any effective technological
|
||||
measures on the Work that restrict the ability of a recipient of the
|
||||
Work from You to exercise the rights granted to that recipient under
|
||||
the terms of the License. This Section 4(a) applies to the Work as
|
||||
incorporated in a Collection, but this does not require the Collection
|
||||
apart from the Work itself to be made subject to the terms of this
|
||||
License. If You create a Collection, upon notice from any Licensor You
|
||||
must, to the extent practicable, remove from the Collection any credit
|
||||
as required by Section 4(c), as requested. If You create an
|
||||
Adaptation, upon notice from any Licensor You must, to the extent
|
||||
practicable, remove from the Adaptation any credit as required by
|
||||
Section 4(c), as requested.
|
||||
b. You may Distribute or Publicly Perform an Adaptation only under the
|
||||
terms of: (i) this License; (ii) a later version of this License with
|
||||
the same License Elements as this License; (iii) a Creative Commons
|
||||
jurisdiction license (either this or a later license version) that
|
||||
contains the same License Elements as this License (e.g.,
|
||||
Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons Compatible
|
||||
License. If you license the Adaptation under one of the licenses
|
||||
mentioned in (iv), you must comply with the terms of that license. If
|
||||
you license the Adaptation under the terms of any of the licenses
|
||||
mentioned in (i), (ii) or (iii) (the "Applicable License"), you must
|
||||
comply with the terms of the Applicable License generally and the
|
||||
following provisions: (I) You must include a copy of, or the URI for,
|
||||
the Applicable License with every copy of each Adaptation You
|
||||
Distribute or Publicly Perform; (II) You may not offer or impose any
|
||||
terms on the Adaptation that restrict the terms of the Applicable
|
||||
License or the ability of the recipient of the Adaptation to exercise
|
||||
the rights granted to that recipient under the terms of the Applicable
|
||||
License; (III) You must keep intact all notices that refer to the
|
||||
Applicable License and to the disclaimer of warranties with every copy
|
||||
of the Work as included in the Adaptation You Distribute or Publicly
|
||||
Perform; (IV) when You Distribute or Publicly Perform the Adaptation,
|
||||
You may not impose any effective technological measures on the
|
||||
Adaptation that restrict the ability of a recipient of the Adaptation
|
||||
from You to exercise the rights granted to that recipient under the
|
||||
terms of the Applicable License. This Section 4(b) applies to the
|
||||
Adaptation as incorporated in a Collection, but this does not require
|
||||
the Collection apart from the Adaptation itself to be made subject to
|
||||
the terms of the Applicable License.
|
||||
c. If You Distribute, or Publicly Perform the Work or any Adaptations or
|
||||
Collections, You must, unless a request has been made pursuant to
|
||||
Section 4(a), keep intact all copyright notices for the Work and
|
||||
provide, reasonable to the medium or means You are utilizing: (i) the
|
||||
name of the Original Author (or pseudonym, if applicable) if supplied,
|
||||
and/or if the Original Author and/or Licensor designate another party
|
||||
or parties (e.g., a sponsor institute, publishing entity, journal) for
|
||||
attribution ("Attribution Parties") in Licensor's copyright notice,
|
||||
terms of service or by other reasonable means, the name of such party
|
||||
or parties; (ii) the title of the Work if supplied; (iii) to the
|
||||
extent reasonably practicable, the URI, if any, that Licensor
|
||||
specifies to be associated with the Work, unless such URI does not
|
||||
refer to the copyright notice or licensing information for the Work;
|
||||
and (iv) , consistent with Ssection 3(b), in the case of an
|
||||
Adaptation, a credit identifying the use of the Work in the Adaptation
|
||||
(e.g., "French translation of the Work by Original Author," or
|
||||
"Screenplay based on original Work by Original Author"). The credit
|
||||
required by this Section 4(c) may be implemented in any reasonable
|
||||
manner; provided, however, that in the case of a Adaptation or
|
||||
Collection, at a minimum such credit will appear, if a credit for all
|
||||
contributing authors of the Adaptation or Collection appears, then as
|
||||
part of these credits and in a manner at least as prominent as the
|
||||
credits for the other contributing authors. For the avoidance of
|
||||
doubt, You may only use the credit required by this Section for the
|
||||
purpose of attribution in the manner set out above and, by exercising
|
||||
Your rights under this License, You may not implicitly or explicitly
|
||||
assert or imply any connection with, sponsorship or endorsement by the
|
||||
Original Author, Licensor and/or Attribution Parties, as appropriate,
|
||||
of You or Your use of the Work, without the separate, express prior
|
||||
written permission of the Original Author, Licensor and/or Attribution
|
||||
Parties.
|
||||
d. Except as otherwise agreed in writing by the Licensor or as may be
|
||||
otherwise permitted by applicable law, if You Reproduce, Distribute or
|
||||
Publicly Perform the Work either by itself or as part of any
|
||||
Adaptations or Collections, You must not distort, mutilate, modify or
|
||||
take other derogatory action in relation to the Work which would be
|
||||
prejudicial to the Original Author's honor or reputation. Licensor
|
||||
agrees that in those jurisdictions (e.g. Japan), in which any exercise
|
||||
of the right granted in Section 3(b) of this License (the right to
|
||||
make Adaptations) would be deemed to be a distortion, mutilation,
|
||||
modification or other derogatory action prejudicial to the Original
|
||||
Author's honor and reputation, the Licensor will waive or not assert,
|
||||
as appropriate, this Section, to the fullest extent permitted by the
|
||||
applicable national law, to enable You to reasonably exercise Your
|
||||
right under Section 3(b) of this License (right to make Adaptations)
|
||||
but not otherwise.
|
||||
|
||||
5. Representations, Warranties and Disclaimer
|
||||
|
||||
UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR
|
||||
OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY
|
||||
KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
|
||||
INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
|
||||
LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS,
|
||||
WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION
|
||||
OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
|
||||
|
||||
6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE
|
||||
LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR
|
||||
ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES
|
||||
ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
7. Termination
|
||||
|
||||
a. This License and the rights granted hereunder will terminate
|
||||
automatically upon any breach by You of the terms of this License.
|
||||
Individuals or entities who have received Adaptations or Collections
|
||||
from You under this License, however, will not have their licenses
|
||||
terminated provided such individuals or entities remain in full
|
||||
compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will
|
||||
survive any termination of this License.
|
||||
b. Subject to the above terms and conditions, the license granted here is
|
||||
perpetual (for the duration of the applicable copyright in the Work).
|
||||
Notwithstanding the above, Licensor reserves the right to release the
|
||||
Work under different license terms or to stop distributing the Work at
|
||||
any time; provided, however that any such election will not serve to
|
||||
withdraw this License (or any other license that has been, or is
|
||||
required to be, granted under the terms of this License), and this
|
||||
License will continue in full force and effect unless terminated as
|
||||
stated above.
|
||||
|
||||
8. Miscellaneous
|
||||
|
||||
a. Each time You Distribute or Publicly Perform the Work or a Collection,
|
||||
the Licensor offers to the recipient a license to the Work on the same
|
||||
terms and conditions as the license granted to You under this License.
|
||||
b. Each time You Distribute or Publicly Perform an Adaptation, Licensor
|
||||
offers to the recipient a license to the original Work on the same
|
||||
terms and conditions as the license granted to You under this License.
|
||||
c. If any provision of this License is invalid or unenforceable under
|
||||
applicable law, it shall not affect the validity or enforceability of
|
||||
the remainder of the terms of this License, and without further action
|
||||
by the parties to this agreement, such provision shall be reformed to
|
||||
the minimum extent necessary to make such provision valid and
|
||||
enforceable.
|
||||
d. No term or provision of this License shall be deemed waived and no
|
||||
breach consented to unless such waiver or consent shall be in writing
|
||||
and signed by the party to be charged with such waiver or consent.
|
||||
e. This License constitutes the entire agreement between the parties with
|
||||
respect to the Work licensed here. There are no understandings,
|
||||
agreements or representations with respect to the Work not specified
|
||||
here. Licensor shall not be bound by any additional provisions that
|
||||
may appear in any communication from You. This License may not be
|
||||
modified without the mutual written agreement of the Licensor and You.
|
||||
f. The rights granted under, and the subject matter referenced, in this
|
||||
License were drafted utilizing the terminology of the Berne Convention
|
||||
for the Protection of Literary and Artistic Works (as amended on
|
||||
September 28, 1979), the Rome Convention of 1961, the WIPO Copyright
|
||||
Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996
|
||||
and the Universal Copyright Convention (as revised on July 24, 1971).
|
||||
These rights and subject matter take effect in the relevant
|
||||
jurisdiction in which the License terms are sought to be enforced
|
||||
according to the corresponding provisions of the implementation of
|
||||
those treaty provisions in the applicable national law. If the
|
||||
standard suite of rights granted under applicable copyright law
|
||||
includes additional rights not granted under this License, such
|
||||
additional rights are deemed to be included in the License; this
|
||||
License is not intended to restrict the license of any rights under
|
||||
applicable law.
|
||||
|
||||
|
||||
Creative Commons Notice
|
||||
|
||||
Creative Commons is not a party to this License, and makes no warranty
|
||||
whatsoever in connection with the Work. Creative Commons will not be
|
||||
liable to You or any party on any legal theory for any damages
|
||||
whatsoever, including without limitation any general, special,
|
||||
incidental or consequential damages arising in connection to this
|
||||
license. Notwithstanding the foregoing two (2) sentences, if Creative
|
||||
Commons has expressly identified itself as the Licensor hereunder, it
|
||||
shall have all rights and obligations of Licensor.
|
||||
|
||||
Except for the limited purpose of indicating to the public that the
|
||||
Work is licensed under the CCPL, Creative Commons does not authorize
|
||||
the use by either party of the trademark "Creative Commons" or any
|
||||
related trademark or logo of Creative Commons without the prior
|
||||
written consent of Creative Commons. Any permitted use will be in
|
||||
compliance with Creative Commons' then-current trademark usage
|
||||
guidelines, as may be published on its website or otherwise made
|
||||
available upon request from time to time. For the avoidance of doubt,
|
||||
this trademark restriction does not form part of the License.
|
||||
|
||||
Creative Commons may be contacted at http://creativecommons.org/.
|
@ -1 +0,0 @@
|
||||
Adds Latch and Flipflop, that can be used with Mesecon mod.
|
@ -1,128 +0,0 @@
|
||||
local nodebox = {
|
||||
type = "fixed",
|
||||
fixed = {{-8/16, -8/16, -8/16, 8/16, -7/16, 8/16 }},
|
||||
}
|
||||
|
||||
local function gate_rotate_rules(node, rules)
|
||||
for rotations = 0, node.param2 - 1 do
|
||||
rules = mesecon.rotate_rules_left(rules)
|
||||
end
|
||||
return rules
|
||||
end
|
||||
|
||||
|
||||
local function ff_get_input_rules(node)
|
||||
return gate_rotate_rules(node,
|
||||
{
|
||||
{x=-1, y=0, z=0, name="data"},
|
||||
{x=0, y=0, z=-1, name="enable"}
|
||||
})
|
||||
end
|
||||
|
||||
local function ff_get_output_rules(node)
|
||||
return gate_rotate_rules(node,
|
||||
{ {x=1,y=0,z=0 }}
|
||||
)
|
||||
end
|
||||
|
||||
|
||||
local function set_ff(pos,node,state)
|
||||
local ff = minetest.registered_nodes[node.name]
|
||||
if state then
|
||||
minetest.swap_node(pos, {name = ff.onstate, param2=node.param2})
|
||||
mesecon.receptor_on(pos, ff_get_output_rules(node))
|
||||
else
|
||||
minetest.swap_node(pos, {name = ff.offstate, param2=node.param2})
|
||||
mesecon.receptor_off(pos, ff_get_output_rules(node))
|
||||
end
|
||||
end
|
||||
|
||||
local function update_flipflop(pos, node, link, newstate)
|
||||
local ff = minetest.registered_nodes[node.name]
|
||||
local meta = minetest.get_meta(pos)
|
||||
|
||||
local data= meta:get_int("data") == 1 and 1 or 0
|
||||
local enable = meta:get_int("enable") == 1 and 1 or 0
|
||||
|
||||
|
||||
|
||||
if link.name == "enable" then
|
||||
if newstate == "off" then
|
||||
meta:set_int("enable",0)
|
||||
end
|
||||
if newstate == "on" and enable == 0 then
|
||||
if data == 0 then
|
||||
set_ff(pos,node,false)
|
||||
else
|
||||
set_ff(pos,node,true)
|
||||
end
|
||||
meta:set_int("enable",1)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
if link.name == "data" then
|
||||
meta:set_int("data", newstate == "on" and 1 or 0 )
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
local function register_flipflop()
|
||||
local name = "flipflop"
|
||||
description = "Logic Memory Circuit: "..name
|
||||
|
||||
local basename = "mesecons_regs:"..name
|
||||
mesecon.register_node(basename,
|
||||
{
|
||||
description = description,
|
||||
inventory_image = "jeija_gate_off.png^jeija_gate_"..name..".png",
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
is_ground_content = false,
|
||||
drawtype = "nodebox",
|
||||
drop = basename.."_off",
|
||||
selection_box = nodebox,
|
||||
node_box = nodebox,
|
||||
walkable = true,
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
onstate = basename.."_on",
|
||||
offstate = basename.."_off",
|
||||
after_dig_node = mesecon.do_cooldown,
|
||||
},{
|
||||
tiles = {"jeija_microcontroller_bottom.png^".."jeija_gate_off.png^"..
|
||||
"jeija_gate_"..name..".png"},
|
||||
groups = {dig_immediate = 2, overheat = 1},
|
||||
mesecons = { receptor = {
|
||||
state = "off",
|
||||
rules = ff_get_output_rules
|
||||
}, effector = {
|
||||
rules = ff_get_input_rules,
|
||||
action_change = update_flipflop
|
||||
}}
|
||||
},{
|
||||
tiles = {"jeija_microcontroller_bottom.png^".."jeija_gate_on.png^"..
|
||||
"jeija_gate_"..name..".png"},
|
||||
groups = {dig_immediate = 2, not_in_creative_inventory = 1, overheat = 1},
|
||||
mesecons = { receptor = {
|
||||
state = "on",
|
||||
rules = ff_get_output_rules
|
||||
}, effector = {
|
||||
rules = ff_get_input_rules,
|
||||
action_change = update_flipflop
|
||||
}}
|
||||
})
|
||||
|
||||
minetest.register_craft({output = basename.."_off",
|
||||
recipe = {
|
||||
{ "mesecons_regs:latch_off", "mesecons_regs:latch_off", },
|
||||
{ "mesecons_gates:not_off", "mesecons_insulated:insulated_off",},
|
||||
{ "mesecons_extrawires:tjunction_off", "mesecons_extrawires:corner_off", }
|
||||
}})
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
register_flipflop()
|
@ -1,138 +0,0 @@
|
||||
local nodebox = {
|
||||
type = "fixed",
|
||||
fixed = {{-8/16, -8/16, -8/16, 8/16, -7/16, 8/16 }},
|
||||
}
|
||||
|
||||
local function gate_rotate_rules(node, rules)
|
||||
for rotations = 0, node.param2 - 1 do
|
||||
rules = mesecon.rotate_rules_left(rules)
|
||||
end
|
||||
return rules
|
||||
end
|
||||
|
||||
|
||||
local function latch_get_input_rules(node)
|
||||
return gate_rotate_rules(node,
|
||||
{
|
||||
{x=-1, y=0, z=0, name="data"},
|
||||
{x=0, y=0, z=-1, name="enable"}
|
||||
})
|
||||
end
|
||||
|
||||
local function latch_get_output_rules(node)
|
||||
return gate_rotate_rules(node,
|
||||
{ {x=1,y=0,z=0 }}
|
||||
)
|
||||
end
|
||||
|
||||
|
||||
local function set_latch(pos,node,state)
|
||||
local latch = minetest.registered_nodes[node.name]
|
||||
if state then
|
||||
minetest.swap_node(pos, {name = latch.onstate, param2=node.param2})
|
||||
mesecon.receptor_on(pos, latch_get_output_rules(node))
|
||||
else
|
||||
minetest.swap_node(pos, {name = latch.offstate, param2=node.param2})
|
||||
mesecon.receptor_off(pos, latch_get_output_rules(node))
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local function update_latch(pos, node, link, newstate)
|
||||
local latch = minetest.registered_nodes[node.name]
|
||||
local meta = minetest.get_meta(pos)
|
||||
|
||||
local data= meta:get_int("data") == 1 and 1 or 0
|
||||
local enable = meta:get_int("enable") == 1 and 1 or 0
|
||||
|
||||
if link.name == "enable" then
|
||||
if newstate == "off" and enable == 1 then
|
||||
if data == 0 then
|
||||
set_latch(pos,node,false)
|
||||
else
|
||||
set_latch(pos,node,true)
|
||||
end
|
||||
meta:set_int("enable",0)
|
||||
end
|
||||
if newstate == "on" then
|
||||
if data == 0 then
|
||||
set_latch(pos,node,false)
|
||||
else
|
||||
set_latch(pos,node,true)
|
||||
end
|
||||
meta:set_int("enable",1)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
if link.name == "data" then
|
||||
if enable == 1 then
|
||||
local nv = newstate == "on" and 1 or 0
|
||||
set_latch(pos,node, nv == 1 and true or false)
|
||||
meta:set_int("data",nv)
|
||||
else
|
||||
meta:set_int("data", newstate == "on" and 1 or 0 )
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
local function register_latch()
|
||||
local name = "latch"
|
||||
description = "Logic Memory Circuit: "..name
|
||||
|
||||
local basename = "mesecons_regs:"..name
|
||||
mesecon.register_node(basename,
|
||||
{
|
||||
description = description,
|
||||
inventory_image = "jeija_gate_off.png^jeija_gate_"..name..".png",
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
is_ground_content = false,
|
||||
drawtype = "nodebox",
|
||||
drop = basename.."_off",
|
||||
selection_box = nodebox,
|
||||
node_box = nodebox,
|
||||
walkable = true,
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
onstate = basename.."_on",
|
||||
offstate = basename.."_off",
|
||||
after_dig_node = mesecon.do_cooldown,
|
||||
},{
|
||||
tiles = {"jeija_microcontroller_bottom.png^".."jeija_gate_off.png^"..
|
||||
"jeija_gate_"..name..".png"},
|
||||
groups = {dig_immediate = 2, overheat = 1},
|
||||
mesecons = { receptor = {
|
||||
state = "off",
|
||||
rules = latch_get_output_rules
|
||||
}, effector = {
|
||||
rules = latch_get_input_rules,
|
||||
action_change = update_latch
|
||||
}}
|
||||
},{
|
||||
tiles = {"jeija_microcontroller_bottom.png^".."jeija_gate_on.png^"..
|
||||
"jeija_gate_"..name..".png"},
|
||||
groups = {dig_immediate = 2, not_in_creative_inventory = 1, overheat = 1},
|
||||
mesecons = { receptor = {
|
||||
state = "on",
|
||||
rules = latch_get_output_rules
|
||||
}, effector = {
|
||||
rules = latch_get_input_rules,
|
||||
action_change = update_latch
|
||||
}}
|
||||
})
|
||||
|
||||
|
||||
minetest.register_craft({output = basename.."_off", recipe = {
|
||||
{ "mesecons_gates:and_off", "mesecons_gates:and_off", "mesecons_gates:not_off"},
|
||||
{ "mesecons_gates:nor_off", "mesecons_gates:nor_off", "mesecons_insulated:insulated_off"},
|
||||
{ "mesecons_insulated:insulated_off", "mesecons_insulated:insulated_off", "mesecons_insulated:insulated_off"}
|
||||
}})
|
||||
|
||||
end
|
||||
|
||||
|
||||
register_latch()
|
||||
|
Before Width: | Height: | Size: 192 B |