Add milling machine from non cubic to technic mod.
authorkpoppel <poulsen.kim@gmail.com>
Mon, 6 May 2013 18:00:00 +0000 (20:00 +0200)
committerkpoppel <poulsen.kim@gmail.com>
Mon, 6 May 2013 18:00:00 +0000 (20:00 +0200)
Next step is to make sure it only works if powered.

32 files changed:
technic/chainsaw.lua
technic/cnc.lua [new file with mode: 0644]
technic/cnc_api.lua [new file with mode: 0644]
technic/cnc_nodes.lua [new file with mode: 0644]
technic/init.lua
technic/textures/technic_cnc_bottom.png [new file with mode: 0644]
technic/textures/technic_cnc_cylinder.png [new file with mode: 0644]
technic/textures/technic_cnc_cylinder_horizontal.png [new file with mode: 0644]
technic/textures/technic_cnc_element_cross.png [new file with mode: 0644]
technic/textures/technic_cnc_element_edge.png [new file with mode: 0644]
technic/textures/technic_cnc_element_end.png [new file with mode: 0644]
technic/textures/technic_cnc_element_straight.png [new file with mode: 0644]
technic/textures/technic_cnc_element_t.png [new file with mode: 0644]
technic/textures/technic_cnc_front.png [new file with mode: 0644]
technic/textures/technic_cnc_full.png [new file with mode: 0644]
technic/textures/technic_cnc_half.png [new file with mode: 0644]
technic/textures/technic_cnc_milling_background.png [new file with mode: 0644]
technic/textures/technic_cnc_onecurvededge.png [new file with mode: 0644]
technic/textures/technic_cnc_pyramid.png [new file with mode: 0644]
technic/textures/technic_cnc_side.png [new file with mode: 0644]
technic/textures/technic_cnc_slope.png [new file with mode: 0644]
technic/textures/technic_cnc_slope_edge.png [new file with mode: 0644]
technic/textures/technic_cnc_slope_edge_upsdwn.png [new file with mode: 0644]
technic/textures/technic_cnc_slope_inner_edge.png [new file with mode: 0644]
technic/textures/technic_cnc_slope_inner_edge_upsdwn.png [new file with mode: 0644]
technic/textures/technic_cnc_slope_lying.png [new file with mode: 0644]
technic/textures/technic_cnc_slope_upsdwn.png [new file with mode: 0644]
technic/textures/technic_cnc_sphere.png [new file with mode: 0644]
technic/textures/technic_cnc_spike.png [new file with mode: 0644]
technic/textures/technic_cnc_stick.png [new file with mode: 0644]
technic/textures/technic_cnc_top.png [new file with mode: 0644]
technic/textures/technic_cnc_twocurvededge.png [new file with mode: 0644]

index 2c3fbf5e42b00305569127522f916f70d511e673..c31d9a80d77858b1d50ac47f73c565a79e1c0721 100644 (file)
-chainsaw_max_charge=30000
+-- Configuration
+local chainsaw_max_charge      = 30000 -- 30000 - Maximum charge of the saw
+local chainsaw_charge_per_node = 12    -- 12    - Gives 2500 nodes on a single charge (about 50 complete normal trees)
+local chainsaw_leaves          = true  -- true  - Cut down entire trees, leaves and all
+
 register_power_tool ("technic:chainsaw",chainsaw_max_charge)
 
 minetest.register_tool("technic:chainsaw", {
-       description = "Chainsaw",
-       inventory_image = "technic_chainsaw.png",
-       stack_max = 1,
-       on_use = function(itemstack, user, pointed_thing)
-               if pointed_thing.type=="node" then 
-               item=itemstack:to_table()
-               local meta=get_item_meta(item["metadata"])
-               if meta==nil then return end --tool not charghed
-               if meta["charge"]==nil then return end
-               charge=meta["charge"]
-               charge_to_take=600;
-               if charge-charge_to_take>0 then
-                charge_to_take=chainsaw_dig_it(minetest.get_pointed_thing_position(pointed_thing, above),user,charge_to_take)
-                charge=charge-charge_to_take;  
-               set_RE_wear(item,charge,chainsaw_max_charge)
-               meta["charge"]=charge
-               item["metadata"]=set_item_meta(meta)
-               itemstack:replace(item)
-               return itemstack
-               end
-               end
-       end,
+        description = "Chainsaw",
+        inventory_image = "technic_chainsaw.png",
+        stack_max = 1,
+        on_use = function(itemstack, user, pointed_thing)
+                if pointed_thing.type=="node" then
+                        item=itemstack:to_table()
+                        local meta=get_item_meta(item["metadata"])
+                        if meta==nil then return end --tool not charged
+                        if meta["charge"]==nil then return end
+                        -- Send current charge to digging function so that the chainsaw will stop after digging a number of nodes.
+                        local charge=meta["charge"]
+                        if charge < chainsaw_charge_per_node then return end -- only cut if charged
+
+                        charge=chainsaw_dig_it(minetest.get_pointed_thing_position(pointed_thing, above),user,charge)
+                        set_RE_wear(item,charge,chainsaw_max_charge)
+                        meta["charge"]=charge
+                        item["metadata"]=set_item_meta(meta)
+                        itemstack:replace(item)
+                        return itemstack
+                end
+        end,
 })
 
 minetest.register_craft({
-       output = 'technic:chainsaw',
-       recipe = {
-               {'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:battery'},
-               {'technic:stainless_steel_ingot', 'technic:motor', 'technic:battery'},
-               {'','','moreores:copper_ingot'},
-       }
+        output = 'technic:chainsaw',
+        recipe = {
+                {'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:battery'},
+                {'technic:stainless_steel_ingot', 'technic:motor', 'technic:battery'},
+                {'','','moreores:copper_ingot'},
+        }
 })
 
+-- The default stuff
+local timber_nodenames={["default:jungletree"] = true,
+                        ["default:papyrus"]    = true,
+                        ["default:cactus"]     = true,
+                        ["default:tree"]       = true,
+                        ["default:apple"]      = true
+}
+
+if chainsaw_leaves == true then
+        timber_nodenames["default:leaves"] = true
+end
+
+-- Support moretrees if it is there
+if( minetest.get_modpath("moretrees") ~= nil ) then
+        timber_nodenames["moretrees:apple_tree_trunk"]                 = true
+        timber_nodenames["moretrees:apple_tree_trunk_sideways"]        = true
+        timber_nodenames["moretrees:beech_trunk"]                      = true
+        timber_nodenames["moretrees:beech_trunk_sideways"]             = true
+        timber_nodenames["moretrees:birch_trunk"]                      = true
+        timber_nodenames["moretrees:birch_trunk_sideways"]             = true
+        timber_nodenames["moretrees:fir_trunk"]                        = true
+        timber_nodenames["moretrees:fir_trunk_sideways"]               = true
+        timber_nodenames["moretrees:oak_trunk"]                        = true
+        timber_nodenames["moretrees:oak_trunk_sideways"]               = true
+        timber_nodenames["moretrees:palm_trunk"]                       = true
+        timber_nodenames["moretrees:palm_trunk_sideways"]              = true
+        timber_nodenames["moretrees:pine_trunk"]                       = true
+        timber_nodenames["moretrees:pine_trunk_sideways"]              = true
+        timber_nodenames["moretrees:rubber_tree_trunk"]                = true
+        timber_nodenames["moretrees:rubber_tree_trunk_sideways"]       = true
+        timber_nodenames["moretrees:rubber_tree_trunk_empty"]          = true
+        timber_nodenames["moretrees:rubber_tree_trunk_sideways_empty"] = true
+        timber_nodenames["moretrees:sequoia_trunk"]                    = true
+        timber_nodenames["moretrees:sequoia_trunk_sideways"]           = true
+        timber_nodenames["moretrees:spruce_trunk"]                     = true
+        timber_nodenames["moretrees:spruce_trunk_sideways"]            = true
+        timber_nodenames["moretrees:willow_trunk"]                     = true
+        timber_nodenames["moretrees:willow_trunk_sideways"]            = true
+        timber_nodenames["moretrees:jungletree_trunk"]                 = true
+        timber_nodenames["moretrees:jungletree_trunk_sideways"]        = true
+
+        if chainsaw_leaves == true then
+                timber_nodenames["moretrees:apple_tree_leaves"]        = true
+                timber_nodenames["moretrees:oak_leaves"]               = true
+                timber_nodenames["moretrees:sequoia_leaves"]           = true
+                timber_nodenames["moretrees:birch_leaves"]             = true
+                timber_nodenames["moretrees:birch_leaves"]             = true
+                timber_nodenames["moretrees:palm_leaves"]              = true
+                timber_nodenames["moretrees:spruce_leaves"]            = true
+                timber_nodenames["moretrees:spruce_leaves"]            = true
+                timber_nodenames["moretrees:pine_leaves"]              = true
+                timber_nodenames["moretrees:willow_leaves"]            = true
+                timber_nodenames["moretrees:rubber_tree_leaves"]       = true
+                timber_nodenames["moretrees:jungletree_leaves_green"]  = true
+                timber_nodenames["moretrees:jungletree_leaves_yellow"] = true
+                timber_nodenames["moretrees:jungletree_leaves_red"]    = true
+        end
+end
+
+-- Support growing_trees if it is there
+if( minetest.get_modpath("growing_trees") ~= nil ) then
+        timber_nodenames["growing_trees:trunk"]         = true
+        timber_nodenames["growing_trees:medium_trunk"]  = true
+        timber_nodenames["growing_trees:big_trunk"]     = true
+        timber_nodenames["growing_trees:trunk_top"]     = true
+        timber_nodenames["growing_trees:trunk_sprout"]  = true
+        timber_nodenames["growing_trees:branch_sprout"] = true
+        timber_nodenames["growing_trees:branch"]        = true
+        timber_nodenames["growing_trees:branch_xmzm"]   = true
+        timber_nodenames["growing_trees:branch_xpzm"]   = true
+        timber_nodenames["growing_trees:branch_xmzp"]   = true
+        timber_nodenames["growing_trees:branch_xpzp"]   = true
+        timber_nodenames["growing_trees:branch_zz"]     = true
+        timber_nodenames["growing_trees:branch_xx"]     = true
+
+        if chainsaw_leaves == true then
+                timber_nodenames["growing_trees:leaves"] = true
+        end
+end
+
+-- Support growing_cactus if it is there
+if( minetest.get_modpath("growing_cactus") ~= nil ) then
+        timber_nodenames["growing_cactus:sprout"]                       = true
+        timber_nodenames["growing_cactus:branch_sprout_vertical"]       = true
+        timber_nodenames["growing_cactus:branch_sprout_vertical_fixed"] = true
+        timber_nodenames["growing_cactus:branch_sprout_xp"]             = true
+        timber_nodenames["growing_cactus:branch_sprout_xm"]             = true
+        timber_nodenames["growing_cactus:branch_sprout_zp"]             = true
+        timber_nodenames["growing_cactus:branch_sprout_zm"]             = true
+        timber_nodenames["growing_cactus:trunk"]                        = true
+        timber_nodenames["growing_cactus:branch_trunk"]                 = true
+        timber_nodenames["growing_cactus:branch"]                       = true
+        timber_nodenames["growing_cactus:branch_xp"]                    = true
+        timber_nodenames["growing_cactus:branch_xm"]                    = true
+        timber_nodenames["growing_cactus:branch_zp"]                    = true
+        timber_nodenames["growing_cactus:branch_zm"]                    = true
+        timber_nodenames["growing_cactus:branch_zz"]                    = true
+        timber_nodenames["growing_cactus:branch_xx"]                    = true
+end
+
+-- Table for saving what was sawed down
+local produced
+
+-- Saw down trees entry point
+chainsaw_dig_it = function(pos, player,current_charge)
+        local remaining_charge=current_charge
+
+        -- A bit of trickery here: use a different node drop callback
+        -- and restore the original afterwards.
+        minetest.handle_node_drops = chainsaw_handle_node_drops
+
+        -- clear result and start sawing things down
+        produced = {}
+        remaining_charge = recursive_dig(pos, remaining_charge, player)
+        minetest.sound_play("chainsaw", {pos = pos, gain = 1.0, max_hear_distance = 10,})
+
+        -- Restore the original noder drop handler
+        minetest.handle_node_drops = original_handle_node_drops
+
+        -- Now drop items for the player
+        local number, produced_item, p
+        for produced_item,number in pairs(produced) do
+                --print("ADDING ITEM: " .. produced_item .. " " .. number)
+                -- Drop stacks of 99 or less
+                p = {
+                        x = pos.x + math.random()*4,
+                        y = pos.y,
+                        z = pos.z + math.random()*4
+                }
+                while number > 99 do
+                        minetest.env:add_item(p, produced_item .. " 99")
+                        p = {
+                                x = pos.x + math.random()*4,
+                                y = pos.y,
+                                z = pos.z + math.random()*4
+                        }
+                        number = number - 99
+                end
+                minetest.env:add_item(p, produced_item .. " " .. number)
+        end
+        return remaining_charge
+end
+
+-- Override the default handling routine to be able to count up the
+-- items sawed down so that we can drop them i an nice single stack
+chainsaw_handle_node_drops = function(pos, drops, digger)
+        -- Add dropped items to list of collected nodes
+        local _, dropped_item
+        for _, dropped_item in ipairs(drops) do
+                if produced[dropped_item] == nil then
+                        produced[dropped_item] = 1
+                else
+                        produced[dropped_item] = produced[dropped_item] + 1
+                end
+        end
+end
+
+-- Save the currently installed dropping mechanism so we can restore it.
+local original_handle_node_drops = minetest.handle_node_drops
 
+-- This function does all the hard work. Recursively we dig the node at hand
+-- if it is in the table and then search the surroundings for more stuff to dig.
+recursive_dig = function(pos, remaining_charge, player)
+        local node=minetest.env:get_node(pos)
+        local i=1
+        -- Lookup node name in timber table:
+        if timber_nodenames[node.name] ~= nil then
+                -- Return if we are out of power
+                if remaining_charge < chainsaw_charge_per_node then
+                        return 0
+                end
+                local np
+                -- wood found - cut it.
+                minetest.env:dig_node(pos)
 
+                remaining_charge=remaining_charge-chainsaw_charge_per_node
+                -- check surroundings and run recursively if any charge left
+                np={x=pos.x+1, y=pos.y, z=pos.z}
+                if timber_nodenames[minetest.env:get_node(np).name] ~= nil then
+                        remaining_charge = recursive_dig(np, remaining_charge)
+                end
+                np={x=pos.x+1, y=pos.y, z=pos.z+1}
+                if timber_nodenames[minetest.env:get_node(np).name] ~= nil then
+                        remaining_charge = recursive_dig(np, remaining_charge)
+                end
+                np={x=pos.x+1, y=pos.y, z=pos.z-1}
+                if timber_nodenames[minetest.env:get_node(np).name] ~= nil then
+                        remaining_charge = recursive_dig(np, remaining_charge)
+                end
 
-timber_nodenames={"default:jungletree", "default:papyrus", "default:cactus", "default:tree"}
+                np={x=pos.x-1, y=pos.y, z=pos.z}
+                if timber_nodenames[minetest.env:get_node(np).name] ~= nil then
+                        remaining_charge = recursive_dig(np, remaining_charge)
+                end
+                np={x=pos.x-1, y=pos.y, z=pos.z+1}
+                if timber_nodenames[minetest.env:get_node(np).name] ~= nil then
+                        remaining_charge = recursive_dig(np, remaining_charge)
+                end
+                np={x=pos.x-1, y=pos.y, z=pos.z-1}
+                if timber_nodenames[minetest.env:get_node(np).name] ~= nil then
+                        remaining_charge = recursive_dig(np, remaining_charge)
+                end
 
-function chainsaw_dig_it (pos, player,charge_to_take)          
-       charge_to_take=0
-       local node=minetest.env:get_node(pos)
-       local i=1
-       while timber_nodenames[i]~=nil do
-               if node.name==timber_nodenames[i] then
-                       charge_to_take=600
-                       np={x=pos.x, y=pos.y, z=pos.z}
-                       while minetest.env:get_node(np).name==timber_nodenames[i] do
-                               minetest.env:remove_node(np)
-                               minetest.env:add_item(np, timber_nodenames[i])
-                               np={x=np.x, y=np.y+1, z=np.z}
-                       end
-                       minetest.sound_play("chainsaw", {pos = pos, gain = 1.0, max_hear_distance = 10,})
-                       return charge_to_take   
-               end
-               i=i+1
-       end
+                np={x=pos.x, y=pos.y+1, z=pos.z}
+                if timber_nodenames[minetest.env:get_node(np).name] ~= nil then
+                        remaining_charge = recursive_dig(np, remaining_charge)
+                end
 
-return charge_to_take
+                np={x=pos.x, y=pos.y, z=pos.z+1}
+                if timber_nodenames[minetest.env:get_node(np).name] ~= nil then
+                        remaining_charge = recursive_dig(np, remaining_charge)
+                end
+                np={x=pos.x, y=pos.y, z=pos.z-1}
+                if timber_nodenames[minetest.env:get_node(np).name] ~= nil then
+                        remaining_charge = recursive_dig(np, remaining_charge)
+                end
+                return remaining_charge
+        end
+        -- Nothing sawed down
+        return remaining_charge
 end
diff --git a/technic/cnc.lua b/technic/cnc.lua
new file mode 100644 (file)
index 0000000..6e763ef
--- /dev/null
@@ -0,0 +1,208 @@
+-- Technic CNC v1.0 by kpo
+-- Based on the NonCubic Blocks MOD v1.4 by yves_de_beck
+local shape = {}
+local size = 0
+local onesize_products = {
+   slope                   = 2,
+   slope_edge              = 1,
+   slope_inner_edge        = 1,
+   pyramid                 = 2,
+   spike                   = 1,
+   cylinder                = 2,
+   sphere                  = 1,
+   stick                   = 8,
+   slope_upsdwn            = 2,
+   slope_edge_upsdwn       = 1,
+   slope_inner_edge_upsdwn = 1,
+   cylinder_hor            = 2,
+   slope_lying             = 2,
+   onecurvededge           = 1,
+   twocurvededge           = 1,
+}
+local twosize_products = {
+   element_straight        = 4,
+   element_end             = 2,
+   element_cross           = 1,
+   element_t               = 1,
+   element_edge            = 2,
+}
+
+local showbackground = "--"
+local max_cncruns  = 99
+local max_products = 99
+
+--showlabelin  = ""
+--showlabelout = "label[4.5,5.5;Out:]"
+
+-- I want the CNC machine to be a two block thing
+minetest.register_node("technic:cnc", {
+       description = "CNC Milling Machine",
+        tiles       = {"technic_cnc_top.png", "technic_cnc_bottom.png", "technic_cnc_side.png",
+                      "technic_cnc_side.png", "technic_cnc_side.png", "technic_cnc_front.png"},
+        drawtype    = "nodebox",
+        paramtype   = "light",
+        paramtype2  = "facedir",
+        node_box    = {
+          type  = "fixed",
+          fixed = {
+             {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
+             
+          },
+        },
+        selection_box = {
+          type = "fixed",
+          fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
+        },
+        groups = {oddly_breakable_by_hand=2, cracky=3, dig_immediate=1},
+       
+       can_dig = function(pos,player)
+                    local meta = minetest.env:get_meta(pos);
+                    local inv = meta:get_inventory()
+                    if not inv:is_empty("input") or not inv:is_empty("output") then
+                       minetest.chat_send_player(player:get_player_name(), "CNC machine cannot be removed because it is not empty");
+                       return false
+                    end
+                    return true
+                 end,
+
+       on_construct = function(pos)
+                         local meta = minetest.env:get_meta(pos)
+                         if technic_cnc_api.allow_menu_background == true or technic_cnc_api.allow_menu_background == 1 then
+                            showbackground = "background[-0.15,-0.25;8.40,11.75;technic_cnc_background.png]"
+                         end
+                         
+                         meta:set_string("formspec", "invsize[8,11;]"..
+                                         "label[0,0;Choose Milling Program:]"..
+                                         "image_button[0,0.5;1,1;technic_cnc_slope.png;slope; ]"..
+                                         "image_button[1,0.5;1,1;technic_cnc_slope_edge.png;slope_edge; ]"..
+                                         "image_button[2,0.5;1,1;technic_cnc_slope_inner_edge.png;slope_inner_edge; ]"..
+                                         "image_button[3,0.5;1,1;technic_cnc_pyramid.png;pyramid; ]"..
+                                         "image_button[4,0.5;1,1;technic_cnc_spike.png;spike; ]"..
+                                         "image_button[5,0.5;1,1;technic_cnc_cylinder.png;cylinder; ]"..
+                                         "image_button[6,0.5;1,1;technic_cnc_sphere.png;sphere; ]"..
+                                         "image_button[7,0.5;1,1;technic_cnc_stick.png;stick; ]"..
+
+                                         "image_button[0,1.5;1,1;technic_cnc_slope_upsdwn.png;slope_upsdwn; ]"..
+                                         "image_button[1,1.5;1,1;technic_cnc_slope_edge_upsdwn.png;slope_upsdwn_edge; ]"..
+                                         "image_button[2,1.5;1,1;technic_cnc_slope_inner_edge_upsdwn.png;slope_upddown_inner_edge; ]"..
+                                         "image_button[5,1.5;1,1;technic_cnc_cylinder_horizontal.png;cylinder_horizontal; ]"..
+
+                                         "image_button[0,2.5;1,1;technic_cnc_slope_lying.png;slope_lying; ]"..
+                                         "image_button[1,2.5;1,1;technic_cnc_onecurvededge.png;onecurvededge; ]"..
+                                         "image_button[2,2.5;1,1;technic_cnc_twocurvededge.png;twocurvededge; ]"..
+
+                                         "label[0,3.5;Slim Elements half / normal height:]"..
+
+                                         "image_button[0,4;1,0.5;technic_cnc_full.png;full; ]"..
+                                         "image_button[0,4.5;1,0.5;technic_cnc_half.png;half; ]"..
+                                         "image_button[1,4;1,1;technic_cnc_element_straight.png;element_straight; ]"..
+                                         "image_button[2,4;1,1;technic_cnc_element_end.png;element_end; ]"..
+                                         "image_button[3,4;1,1;technic_cnc_element_cross.png;element_cross; ]"..
+                                         "image_button[4,4;1,1;technic_cnc_element_t.png;element_t; ]"..
+                                         "image_button[5,4;1,1;technic_cnc_element_edge.png;element_edge; ]"..
+
+                                         "label[0, 5.5;In:]".. -- showlabelin..
+                                         "list[current_name;input;0.5,5.5;1,1;]"..
+                                         "field[3, 6;1,1;num_cncruns;Repeat program:;${num_cncruns}]".. -- Fill default with meta data num_cncruns
+                                         "label[4, 5.5;Out:]".. -- showlabelout..
+                                         "list[current_name;output;4.5,5.5;1,1;]"..
+
+                                         "list[current_player;main;0,7;8,4;]"..
+                                         showbackground)
+                         meta:set_string("infotext", "CNC Milling Machine")
+                         meta:set_string("num_cncruns", 1 );
+
+                         local inv = meta:get_inventory()
+                         inv:set_size("input", 1)
+                         inv:set_size("output", 1)
+                      end,
+       
+       on_receive_fields = function(pos, formname, fields, sender)
+                              -- REGISTER MILLING PROGRAMMS AND OUTPUTS:
+                              ------------------------------------------
+                              -- Program for half/full size
+                              if fields["full"] then
+                                 size = 1
+                                 return
+                              end
+                              
+                              if fields["half"] then
+                                 size = 2
+                                 return
+                              end
+                              
+                              local meta = minetest.env:get_meta(pos)
+                              local inv = meta:get_inventory()
+
+                              -- Limit the number entered
+                              if( fields.num_cncruns  and tonumber( fields.num_cncruns) > 0 and tonumber(fields.num_cncruns) < 100 ) then
+                                 meta:set_string( "num_cncruns", fields.num_cncruns );
+                              else
+                                 minetest.chat_send_player(sender:get_player_name(), "CNC machine runs set to a bad value. Machine resets.");
+                                 meta:set_string( "num_cncruns", 1 );
+                                 fields.num_cncruns = 1
+                              end
+                              
+                              -- Do nothing if the machine is empty
+                              if inv:is_empty("input") then
+                                 return
+                              end
+
+                              -- Do nothing if the output is not empty and the product used is not the same as what is already there
+
+                              -- Resolve the node name and the number of items to make and the number of items to take
+                              local product    = ""
+                              local produces   = 1
+                              local input_used = 1
+                              local inputstack = inv:get_stack("input", 1)
+                              local inputname  = inputstack:get_name()
+                              local multiplier = 1
+                              for k, _ in pairs(fields) do
+                                 -- Set a multipier for the half/full size capable blocks
+                                 if twosize_products[k] ~= nil then
+                                    multiplier = size*twosize_products[k]
+                                 else
+                                    multiplier = onesize_products[k]
+                                 end
+                                 
+                                 if onesize_products[k] ~= nil or twosize_products[k] ~= nil then
+                                    product    = inputname .. "_technic_cnc_" .. k
+                                    produces   = math.min( fields.num_cncruns*multiplier, max_products)  -- produce at most max_products
+                                    input_used = math.min( math.floor(produces/multiplier), inputstack:get_count()) -- use at most what we got
+                                    produces   = input_used*multiplier -- final production
+                                    print(size)
+                                    print(fields.num_cncruns)
+                                    print(product)
+                                    print(produces)
+                                    print(input_used)
+                                    print("------------------")
+                                    break
+                                 end
+                              end
+
+                              -- CNC does the transformation
+                              ------------------------------
+                              if minetest.registered_nodes[product] ~= nil then
+                                 inv:add_item("output",product .. " " .. produces)
+                                 inputstack:take_item(input_used)
+                                 inv:set_stack("input",1,inputstack)
+                              else
+                                 minetest.chat_send_player(sender:get_player_name(), "CNC machine does not know how to mill this material. Please remove it.");
+                              end
+                              return;
+                           end, -- callback function
+     })
+----------
+
+
+-- Milling Machine Recipe
+-------------------------
+minetest.register_craft({
+                          output = 'technic:cnc',
+                          recipe = {
+                             {'default:glass',              'technic:diamond_drill_head', 'default:glass'},
+                             {'technic:control_logic_unit', 'technic:motor',              'default:steel_ingot'},
+                             {'default:steel_ingot',        'default:copper_ingot',       'default:steel_ingot'},         
+                          },
+                       })
+-------------------------
\ No newline at end of file
diff --git a/technic/cnc_api.lua b/technic/cnc_api.lua
new file mode 100644 (file)
index 0000000..390a996
--- /dev/null
@@ -0,0 +1,970 @@
+-- API for the technic CNC machine
+-- Again code is adapted from the NonCubic Blocks MOD v1.4 by yves_de_beck
+technic_cnc_api = {}
+
+-- HERE YOU CAN CHANGE THE DETAIL-LEVEL:
+----------------------------------------
+technic_cnc_api.detail_level = 16 -- 16; 1-32
+
+-- HERE YOU CAN DE/ACTIVATE BACKGROUND FOR CNC MENU:
+--------------------------------------------------------
+technic_cnc_api.allow_menu_background = false
+
+-- REGISTER NONCUBIC FORMS, CREATE MODELS AND RECIPES:
+------------------------------------------------------
+
+-- SLOPE
+--------
+function technic_cnc_api.register_slope(recipeitem, groups, images, description)
+
+local slopebox = {}
+local detail = technic_cnc_api.detail_level
+for i = 0, detail-1 do
+        slopebox[i+1]={-0.5, (i/detail)-0.5, (i/detail)-0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5}
+end
+
+minetest.register_node(":" .. recipeitem .. "_technic_cnc_slope", {
+        description = description,
+        drawtype = "nodebox",
+        tiles = images,
+        paramtype = "light",
+        paramtype2 = "facedir",
+        walkable = true,
+        selection_box = {
+                type = "fixed",
+                fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
+        },
+        node_box = {
+                type = "fixed",
+                fixed = slopebox,
+        },
+        groups = groups,
+        })
+end
+
+
+-- SLOPE Lying
+----------------
+function technic_cnc_api.register_slope_lying(recipeitem, groups, images, description)
+
+local slopeboxlying = {}
+local detail = technic_cnc_api.detail_level
+for i = 0, detail-1 do
+        slopeboxlying[i+1]={(i/detail)-0.5, -0.5, (i/detail)-0.5, (i/detail)-0.5+(1/detail), 0.5 , 0.5}
+end
+minetest.register_node(":" .. recipeitem .. "_technic_cnc_slope_lying", {
+        description = description,
+        drawtype = "nodebox",
+        tiles = images,
+        paramtype = "light",
+        paramtype2 = "facedir",
+        walkable = true,
+        selection_box = {
+                type = "fixed",
+                fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
+        },
+        node_box = {
+                type = "fixed",
+                fixed = slopeboxlying,
+        },
+        groups = groups,
+        })
+        minetest.register_craft({
+                output = recipeitem .. "_technic_cnc_slope_lying 1",
+                recipe = {
+                        {"", "", ""},
+                        {"", recipeitem .. "_technic_cnc_slope", ""},
+                        {"", "", ""},           
+                },
+        })
+
+end
+
+
+-- SLOPE UPSIDE DOWN
+--------------------
+function technic_cnc_api.register_slope_upsdown(recipeitem, groups, images, description)
+
+if subname == "dirt" then
+return
+end
+
+local slopeupdwnbox = {}
+local detail = technic_cnc_api.detail_level
+for i = 0, detail-1 do
+        slopeupdwnbox[i+1]={-0.5, (i/detail)-0.5, (-1*(i/detail))+0.5-(1/detail), 0.5, (i/detail)-0.5+(1/detail), 0.5}
+end
+minetest.register_node(":" .. recipeitem .. "_technic_cnc_slope_upsdown", {
+        description = description,
+        drawtype = "nodebox",
+        tiles = images,
+        paramtype = "light",
+        paramtype2 = "facedir",
+        walkable = true,
+        selection_box = {
+                type = "fixed",
+                fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
+        },
+        node_box = {
+                type = "fixed",
+                fixed = slopeupdwnbox,
+        },
+        groups = groups,
+        })
+end
+
+
+-- SLOPE EDGE
+-------------
+function technic_cnc_api.register_slope_edge(recipeitem, groups, images, description)
+
+local slopeboxedge = {}
+local detail = technic_cnc_api.detail_level
+for i = 0, detail-1 do
+        slopeboxedge[i+1]={(i/detail)-0.5, -0.5, (i/detail)-0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5}
+end
+minetest.register_node(":" .. recipeitem .. "_technic_cnc_slope_edge", {
+        description = description,
+        drawtype = "nodebox",
+        tiles = images,
+        paramtype = "light",
+        paramtype2 = "facedir",
+        walkable = true,
+        selection_box = {
+                type = "fixed",
+                fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
+        },
+        node_box = {
+                type = "fixed",
+                fixed = slopeboxedge,
+        },
+        groups = groups,
+        })
+end
+
+
+-- SLOPE INNER EDGE
+-------------------
+function technic_cnc_api.register_slope_inner_edge(recipeitem, groups, images, description)
+
+minetest.register_node(":" .. recipeitem .. "_technic_cnc_slope_inner_edge", {
+        description = description,
+        drawtype = "nodebox",
+        tiles = images,
+        paramtype = "light",
+        paramtype2 = "facedir",
+        walkable = true,
+        selection_box = {
+                type = "fixed",
+                fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
+        },
+        node_box = {
+                type = "fixed",
+                fixed = {
+                        -- PART 1
+                        {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5},
+                        {-0.45, -0.5, -0.5, 0.5, -0.4, 0.5},
+                        {-0.4, -0.5, -0.5, 0.5, -0.35, 0.5},
+                        {-0.35, -0.5, -0.5, 0.5, -0.3, 0.5},
+                        {-0.3, -0.5, -0.5, 0.5, -0.25, 0.5},
+                        {-0.25, -0.5, -0.5, 0.5, -0.2, 0.5},
+                        {-0.2, -0.5, -0.5, 0.5, -0.15, 0.5},
+                        {-0.15, -0.5, -0.5, 0.5, -0.1, 0.5},
+                        {-0.1, -0.5, -0.5, 0.5, -0.05, 0.5},
+                        {-0.05, -0.5, -0.5, 0.5, 0, 0.5},
+                        {0, -0.5, -0.5, 0.5, 0.05, 0.5},
+                        {0.05, -0.5, -0.5, 0.5, 0.1, 0.5},
+                        {0.1, -0.5, -0.5, 0.5, 0.15, 0.5},
+                        {0.15, -0.5, -0.5, 0.5, 0.2, 0.5},
+                        {0.2, -0.5, -0.5, 0.5, 0.25, 0.5},
+                        {0.25, -0.5, -0.5, 0.5, 0.3, 0.5},
+                        {0.3, -0.5, -0.5, 0.5, 0.35, 0.5},
+                        {0.35, -0.5, -0.5, 0.5, 0.4, 0.5},
+                        {0.4, -0.5, -0.5, 0.5, 0.45, 0.5},
+                        {0.45, -0.5, -0.5, 0.5, 0.5, 0.5},
+                        -- PART 2
+                        {-0.5, -0.5, -0.45, 0.5, -0.45, 0.5},
+                        {-0.5, -0.5, -0.4, 0.5, -0.4, 0.5},
+                        {-0.5, -0.5, -0.35, 0.5, -0.35, 0.5},
+                        {-0.5, -0.5, -0.3, 0.5, -0.3, 0.5},
+                        {-0.5, -0.5, -0.25, 0.5, -0.25, 0.5},
+                        {-0.5, -0.5, -0.2, 0.5, -0.2, 0.5},
+                        {-0.5, -0.5, -0.15, 0.5, -0.15, 0.5},
+                        {-0.5, -0.5, -0.1, 0.5, -0.1, 0.5},
+                        {-0.5, -0.5, -0.05, 0.5, -0.05, 0.5},
+                        {-0.5, -0.5, 0, 0.5, 0, 0.5},
+                        {-0.5, -0.5, 0.05, 0.5, 0.05, 0.5},
+                        {-0.5, -0.5, 0.1, 0.5, 0.1, 0.5},
+                        {-0.5, -0.5, 0.15, 0.5, 0.15, 0.5},
+                        {-0.5, -0.5, 0.2, 0.5, 0.2, 0.5},
+                        {-0.5, -0.5, .25, 0.5, 0.25, 0.5},
+                        {-0.5, -0.5, 0.3, 0.5, 0.3, 0.5},
+                        {-0.5, -0.5, 0.35, 0.5, 0.35, 0.5},
+                        {-0.5, -0.5, 0.4, 0.5, 0.4, 0.5},
+                        {-0.5, -0.5, 0.45, 0.5, 0.45, 0.5},
+                        {-0.5, -0.5, 0.5, 0.5, 0.5, 0.5},
+                        },
+        },
+        groups = groups,
+        })
+end
+
+
+-- SLOPE EDGE UPSIDE DOWN
+-------------------------
+function technic_cnc_api.register_slope_upsdown_edge(recipeitem, groups, images, description)
+
+if recipeitem == "default:dirt" then
+   return
+end
+
+local slopeupdwnboxedge = {}
+local detail = technic_cnc_api.detail_level
+for i = 0, detail-1 do
+        slopeupdwnboxedge[i+1]={(-1*(i/detail))+0.5-(1/detail), (i/detail)-0.5, (-1*(i/detail))+0.5-(1/detail), 0.5, (i/detail)-0.5+(1/detail), 0.5}
+end
+minetest.register_node(":" .. recipeitem .. "_technic_cnc_slope_upsdown_edge", {
+        description = description,
+        drawtype = "nodebox",
+        tiles = images,
+        paramtype = "light",
+        paramtype2 = "facedir",
+        walkable = true,
+        selection_box = {
+                type = "fixed",
+                fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
+        },
+        node_box = {
+                type = "fixed",
+                fixed = slopeupdwnboxedge,
+        },
+        groups = groups,
+        })
+end
+
+
+-- SLOPE INNER EDGE UPSIDE DOWN
+-------------------------------
+function technic_cnc_api.register_slope_upsdown_inner_edge(recipeitem, groups, images, description)
+
+if recipename == "default:dirt" then
+return
+end
+
+minetest.register_node(":" .. recipeitem .. "_technic_cnc_slope_upsdown_inner_edge", {
+        description = description,
+        drawtype = "nodebox",
+        tiles = images,
+        paramtype = "light",
+        paramtype2 = "facedir",
+        walkable = true,
+        selection_box = {
+                type = "fixed",
+                fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
+        },
+        node_box = {
+                type = "fixed",
+                fixed = {
+                        {0.45, -0.5, -0.5, 0.5, -0.45, 0.5},
+                        {0.4, -0.45, -0.5, 0.5, -0.4, 0.5},
+                        {0.35, -0.4, -0.5, 0.5, -0.35, 0.5},
+                        {0.3, -0.35, -0.5, 0.5, -0.3, 0.5},
+                        {0.25, -0.3, -0.5, 0.5, -0.25, 0.5},
+                        {0.2, -0.25, -0.5, 0.5, -0.2, 0.5},
+                        {0.15, -0.2, -0.5, 0.5, -0.15, 0.5},
+                        {0.1, -0.15, -0.5, 0.5, -0.1, 0.5},
+                        {0.05, -0.1, -0.5, 0.5, -0.05, 0.5},
+                        {0, -0.05, -0.5, 0.5, 0, 0.5},
+                        {-0.05, 0, -0.5, 0.5, 0.05, 0.5},
+                        {-0.1, 0.05, -0.5, 0.5, 0.1, 0.5},
+                        {-0.15, 0.1, -0.5, 0.5, 0.15, 0.5},
+                        {-0.2, 0.15, -0.5, 0.5, 0.2, 0.5},
+                        {-0.25, 0.2, -0.5, 0.5, 0.25, 0.5},
+                        {-0.3, 0.25, -0.5, 0.5, 0.3, 0.5},
+                        {-0.35, 0.3, -0.5, 0.5, 0.35, 0.5},
+                        {-0.4, 0.35, -0.5, 0.5, 0.4, 0.5},
+                        {-0.45, 0.4, -0.5, 0.5, 0.45, 0.5},
+                        {-0.5, 0.45, -0.5, 0.5, 0.5, 0.5},
+
+                        {-0.5, -0.5, 0.45, 0.5, -0.45, 0.5},
+                        {-0.5, -0.45, 0.4, 0.5, -0.4, 0.5},
+                        {-0.5, -0.4, 0.35, 0.5, -0.35, 0.5},
+                        {-0.5, -0.35, 0.3, 0.5, -0.3, 0.5},
+                        {-0.5, -0.3, 0.25, 0.5, -0.25, 0.5},
+                        {-0.5, -0.25, 0.2, 0.5, -0.2, 0.5},
+                        {-0.5, -0.2, 0.15, 0.5, -0.15, 0.5},
+                        {-0.5, -0.15, 0.1, 0.5, -0.1, 0.5},
+                        {-0.5, -0.1, 0.05, 0.5, -0.05, 0.5},
+                        {-0.5, -0.05, 0, 0.5, 0, 0.5},
+                        {-0.5, 0, -0.05, 0.5, 0.05, 0.5},
+                        {-0.5, 0.05, -0.1, 0.5, 0.1, 0.5},
+                        {-0.5, 0.1, -0.15, 0.5, 0.15, 0.5},
+                        {-0.5, 0.15, -0.2, 0.5, 0.2, 0.5},
+                        {-0.5, 0.2, -0.25, 0.5, 0.25, 0.5},
+                        {-0.5, 0.25, -0.3, 0.5, 0.3, 0.5},
+                        {-0.5, 0.3, -0.35, 0.5, 0.35, 0.5},
+                        {-0.5, 0.35, -0.4, 0.5, 0.4, 0.5},
+                        {-0.5, 0.4, -0.45, 0.5, 0.45, 0.5},
+                        {-0.5, 0.45, -0.5, 0.5, 0.5, 0.5},
+
+                        },
+        },
+        groups = groups,
+        })
+end
+
+
+-- PYRAMID
+----------
+function technic_cnc_api.register_pyramid(recipeitem, groups, images, description)
+
+local pyrabox = {}
+local detail = technic_cnc_api.detail_level/2
+for i = 0, detail-1 do
+        pyrabox[i+1]={(i/detail/2)-0.5, (i/detail/2)-0.5, (i/detail/2)-0.5, 0.5-(i/detail/2), (i/detail/2)-0.5+(1/detail), 0.5-(i/detail/2)}
+end
+minetest.register_node(":" .. recipeitem .. "_technic_cnc_pyramid", {
+        description = description,
+        drawtype = "nodebox",
+        tiles = images,
+        paramtype = "light",
+        paramtype2 = "facedir",
+        walkable = true,
+        selection_box = {
+                type = "fixed",
+                fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
+        },
+        node_box = {
+                type = "fixed",
+                fixed = pyrabox,
+        },
+        groups = groups,
+        })
+end
+
+
+-- SPIKE
+--------
+function technic_cnc_api.register_spike(recipeitem, groups, images, description)
+
+if recipename == "default:dirt" then
+       return
+end
+
+local spikebox = {}
+local detail = technic_cnc_api.detail_level
+for i = 0, detail-1 do
+        spikebox[i+1]={(i/detail/2)-0.5, (i/detail/2)-0.5, (i/detail/2)-0.5, 0.5-(i/detail/2), (i/detail)-0.5+(1/detail), 0.5-(i/detail/2)}
+end
+minetest.register_node(":" .. recipeitem .. "_technic_cnc_spike", {
+        description = description,
+        drawtype = "nodebox",
+        tiles = images,
+        paramtype = "light",
+        paramtype2 = "facedir",
+        walkable = true,
+        selection_box = {
+                type = "fixed",
+                fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
+        },
+        node_box = {
+                type = "fixed",
+                fixed = spikebox,
+        },
+        groups = groups,
+        })
+end
+
+
+-- Block one curved edge 
+------------------------
+function technic_cnc_api.register_onecurvededge(recipeitem, groups, images, description)
+
+local quartercyclebox = {}
+local detail = technic_cnc_api.detail_level*2
+local sehne
+for i = (detail/2)-1, detail-1 do
+        sehne = math.sqrt(0.25 - (((i/detail)-0.5)^2))
+        quartercyclebox[i]={-0.5, -0.5, -sehne, 0.5, (i/detail)+(1/detail)-0.5, 0.5}
+end
+minetest.register_node(":" .. recipeitem .. "_technic_cnc_onecurvededge", {
+        description = description,
+        drawtype = "nodebox",
+        tiles = images,
+        paramtype = "light",
+        paramtype2 = "facedir",
+        walkable = true,
+        selection_box = {
+                type = "fixed",
+                fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
+        },
+        node_box = {
+                type = "fixed",
+                fixed = quartercyclebox,
+        },
+        groups = groups,
+        })
+end
+
+
+-- Block two curved edges 
+-------------------------
+function technic_cnc_api.register_twocurvededge(recipeitem, groups, images, description)
+
+local quartercyclebox2 = {}
+local detail = technic_cnc_api.detail_level*2
+local sehne
+for i = (detail/2)-1, detail-1 do
+        sehne = math.sqrt(0.25 - (((i/detail)-0.5)^2))
+        quartercyclebox2[i]={-sehne, -0.5, -sehne, 0.5, (i/detail)+(1/detail)-0.5, 0.5}
+end
+minetest.register_node(":" .. recipeitem .. "_technic_cnc_twocurvededge", {
+        description = description,
+        drawtype = "nodebox",
+        tiles = images,
+        paramtype = "light",
+        paramtype2 = "facedir",
+        walkable = true,
+        selection_box = {
+                type = "fixed",
+                fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
+        },
+        node_box = {
+                type = "fixed",
+                fixed = quartercyclebox2,
+        },
+        groups = groups,
+        })
+        minetest.register_craft({
+                output = recipeitem .. "_technic_cnc_twocurvededge 3",
+                recipe = {
+                        {"", "", ""},
+                        {recipeitem .. "_technic_cnc_onecurvededge", "", ""},
+                        {recipeitem .. "_technic_cnc_onecurvededge", recipeitem .. "_technic_cnc_onecurvededge", ""},         
+                },
+        })
+
+end
+
+-- Cylinder
+-----------
+function technic_cnc_api.register_cylinder(recipeitem, groups, images, description)
+
+if recipename == "default:dirt" then
+return
+end
+
+local cylbox = {}
+local detail = technic_cnc_api.detail_level
+local sehne
+for i = 1, detail-1 do
+        sehne = math.sqrt(0.25 - (((i/detail)-0.5)^2))
+        cylbox[i]={(i/detail)-0.5, -0.5, -sehne, (i/detail)+(1/detail)-0.5, 0.5, sehne}
+end
+minetest.register_node(":" .. recipeitem .. "_technic_cnc_cylinder", {
+        description = description,
+        drawtype = "nodebox",
+        tiles = images,
+        paramtype = "light",
+        paramtype2 = "facedir",
+        walkable = true,
+        selection_box = {
+                type = "fixed",
+                fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
+        },
+        node_box = {
+                type = "fixed",
+                fixed = cylbox,
+        },
+        groups = groups,
+        })
+        minetest.register_craft({
+                output = recipeitem .. "_technic_cnc_cylinder 1",
+                recipe = {
+                        {"", "", ""},
+                        {"", recipeitem .. "_technic_cnc_cylinder_horizontal", ""},
+                        {"", "", ""},           
+                },
+        })
+
+end
+
+
+-- Cylinder Horizontal
+----------------------
+function technic_cnc_api.register_cylinder_horizontal(recipeitem, groups, images, description)
+
+if recipename == "default:dirt" then
+       return
+end
+
+local cylbox_horizontal = {}
+local detail = technic_cnc_api.detail_level
+local sehne
+for i = 1, detail-1 do
+        sehne = math.sqrt(0.25 - (((i/detail)-0.5)^2))
+        cylbox_horizontal[i]={-0.5, (i/detail)-0.5, -sehne, 0.5, (i/detail)+(1/detail)-0.5, sehne}
+end
+minetest.register_node(":" .. recipeitem .. "_technic_cnc_cylinder_horizontal", {
+        description = description,
+        drawtype = "nodebox",
+        tiles = images,
+        paramtype = "light",
+        paramtype2 = "facedir",
+        walkable = true,
+        selection_box = {
+                type = "fixed",
+                fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
+        },
+        node_box = {
+                type = "fixed",
+                fixed = cylbox_horizontal,
+        },
+        groups = groups,
+        })
+        minetest.register_craft({
+                output = recipeitem .. "_technic_cnc_cylinder_horizontal 1",
+                recipe = {
+                        {"", "", ""},
+                        {"", recipeitem .. "_technic_cnc_cylinder", ""},
+                        {"", "", ""},           
+                },
+        })
+end
+
+
+-- Sphere
+---------
+function technic_cnc_api.register_sphere(recipeitem, groups, images, description)
+
+if recipename == "default:dirt" then
+       return
+end
+
+local spherebox = {}
+local detail = technic_cnc_api.detail_level
+local sehne
+for i = 1, detail-1 do
+        sehne = math.sqrt(0.25 - (((i/detail)-0.5)^2))
+        spherebox[i]={-sehne, (i/detail)-0.5, -sehne, sehne, (i/detail)+(1/detail)-0.5, sehne}
+end
+minetest.register_node(":" .. recipeitem .. "_technic_cnc_cylinder_sphere", {
+        description = description,
+        drawtype = "nodebox",
+        tiles = images,
+        paramtype = "light",
+        paramtype2 = "facedir",
+        walkable = true,
+        selection_box = {
+                type = "fixed",
+                fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
+        },
+        node_box = {
+                type = "fixed",
+                fixed = spherebox,
+        },
+        groups = groups,
+        })
+end
+
+
+-- Element straight
+-------------------
+function technic_cnc_api.register_element_straight(recipeitem, groups, images, description)
+
+minetest.register_node(":" .. recipeitem .. "_technic_cnc_element_straight", {
+        description = description,
+        drawtype = "nodebox",
+        tiles = images,
+        paramtype = "light",
+        paramtype2 = "facedir",
+        walkable = true,
+        selection_box = {
+                type = "fixed",
+                fixed = {-0.3, -0.5, -0.5, 0.3, 0, 0.5},
+        },
+        node_box = {
+                type = "fixed",
+                fixed = {
+                        {-0.3, -0.5, -0.5, 0.3, 0, 0.5},
+                        },
+        },
+        groups = groups,
+        })
+end
+
+
+-- Element Edge
+---------------
+function technic_cnc_api.register_element_edge(recipeitem, groups, images, description)
+
+minetest.register_node(":" .. recipeitem .. "_technic_cnc_element_edge", {
+        description = description,
+        drawtype = "nodebox",
+        tiles = images,
+        paramtype = "light",
+        paramtype2 = "facedir",
+        walkable = true,
+        selection_box = {
+                type = "fixed",
+                fixed = {
+                        {-0.3, -0.5, -0.5, 0.3, 0, 0.3},
+                        {-0.5, -0.5, -0.3, -0.3, 0, 0.3},
+                        },
+        },
+        node_box = {
+                type = "fixed",
+                fixed = {
+                        {-0.3, -0.5, -0.5, 0.3, 0, 0.3},
+                        {-0.5, -0.5, -0.3, -0.3, 0, 0.3},
+                        },
+        },
+        groups = groups,
+        })
+end
+
+
+-- Element T
+------------
+function technic_cnc_api.register_element_t(recipeitem, groups, images, description)
+
+minetest.register_node(":" .. recipeitem .. "_technic_cnc_element_t", {
+        description = description,
+        drawtype = "nodebox",
+        tiles = images,
+        paramtype = "light",
+        paramtype2 = "facedir",
+        walkable = true,
+        selection_box = {
+                type = "fixed",
+                fixed = {
+                        {-0.3, -0.5, -0.5, 0.3, 0, 0.3},
+                        {-0.5, -0.5, -0.3, -0.3, 0, 0.3},
+                        {0.3, -0.5, -0.3, 0.5, 0, 0.3},
+                        },
+        },
+        node_box = {
+                type = "fixed",
+                fixed = {
+                        {-0.3, -0.5, -0.5, 0.3, 0, 0.3},
+                        {-0.5, -0.5, -0.3, -0.3, 0, 0.3},
+                        {0.3, -0.5, -0.3, 0.5, 0, 0.3},
+                        },
+        },
+        groups = groups,
+        })
+end
+
+
+-- Element Cross
+----------------
+function technic_cnc_api.register_element_cross(recipeitem, groups, images, description)
+
+minetest.register_node(":" .. recipeitem .. "_technic_cnc_element_cross", {
+        description = description,
+        drawtype = "nodebox",
+        tiles = images,
+        paramtype = "light",
+        paramtype2 = "facedir",
+        walkable = true,
+        selection_box = {
+                type = "fixed",
+                fixed = {
+                        {0.3, -0.5, -0.3, 0.5, 0, 0.3},
+                        {-0.3, -0.5, -0.5, 0.3, 0, 0.5},
+                        {-0.5, -0.5, -0.3, -0.3, 0, 0.3},
+                        },
+        },
+        node_box = {
+                type = "fixed",
+                fixed = {
+                        {0.3, -0.5, -0.3, 0.5, 0, 0.3},
+                        {-0.3, -0.5, -0.5, 0.3, 0, 0.5},
+                        {-0.5, -0.5, -0.3, -0.3, 0, 0.3},
+                        },
+        },
+        groups = groups,
+        })
+end
+
+
+-- Element End
+--------------
+function technic_cnc_api.register_element_end(recipeitem, groups, images, description)
+
+minetest.register_node(":" .. recipeitem .. "_technic_cnc_element_end", {
+        description = description,
+        drawtype = "nodebox",
+        tiles = images,
+        paramtype = "light",
+        paramtype2 = "facedir",
+        walkable = true,
+        selection_box = {
+                type = "fixed",
+                fixed = {-0.3, -0.5, -0.3, 0.3, 0, 0.5},
+        },
+        node_box = {
+                type = "fixed",
+                fixed = {-0.3, -0.5, -0.3, 0.3, 0, 0.5},
+        },
+        groups = groups,
+        })
+end
+
+
+-- Element straight DOUBLE
+--------------------------
+function technic_cnc_api.register_element_straight_double(recipeitem, groups, images, description)
+
+minetest.register_node(":" .. recipeitem .. "_technic_cnc_element_straight_double", {
+        description = description,
+        drawtype = "nodebox",
+        tiles = images,
+        paramtype = "light",
+        paramtype2 = "facedir",
+        walkable = true,
+        selection_box = {
+                type = "fixed",
+                fixed = {-0.3, -0.5, -0.5, 0.3, 0.5, 0.5},
+        },
+        node_box = {
+                type = "fixed",
+                fixed = {
+                        {-0.3, -0.5, -0.5, 0.3, 0.5, 0.5},
+                        },
+        },
+        groups = groups,
+        })
+        minetest.register_craft({
+                output = recipeitem .. "_technic_cnc_element_straight_double 1",
+                recipe = {
+                        {"", "", ""},
+                        {"", recipeitem .. "_technic_cnc_element_straight", ""},
+                        {"", recipeitem .. "_technic_cnc_element_straight", ""},           
+                },
+        })
+end
+
+
+-- Element Edge DOUBLE
+----------------------
+function technic_cnc_api.register_element_edge_double(recipeitem, groups, images, description)
+
+minetest.register_node(":" .. recipeitem .. "_technic_cnc_element_edge_double", {
+        description = description,
+        drawtype = "nodebox",
+        tiles = images,
+        paramtype = "light",
+        paramtype2 = "facedir",
+        walkable = true,
+        selection_box = {
+                type = "fixed",
+                fixed = {
+                        {-0.3, -0.5, -0.5, 0.3, 0.5, 0.3},
+                        {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3},
+                        },
+        },
+        node_box = {
+                type = "fixed",
+                fixed = {
+                        {-0.3, -0.5, -0.5, 0.3, 0.5, 0.3},
+                        {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3},
+                        },
+        },
+        groups = groups,
+        })
+        minetest.register_craft({
+                output = recipeitem .. "_technic_cnc_element_edge_double 1",
+                recipe = {
+                        {"", "", ""},
+                        {"", recipeitem .. "_technic_cnc_element_edge", ""},
+                        {"", recipeitem .. "_technic_cnc_element_edge", ""},               
+                },
+        })
+end
+
+
+-- Element T DOUBLE
+-------------------
+function technic_cnc_api.register_element_t_double(recipeitem, groups, images, description)
+
+minetest.register_node(":" .. recipeitem .. "_technic_cnc_element_t_double", {
+        description = description,
+        drawtype = "nodebox",
+        tiles = images,
+        paramtype = "light",
+        paramtype2 = "facedir",
+        walkable = true,
+        selection_box = {
+                type = "fixed",
+                fixed = {
+                        {-0.3, -0.5, -0.5, 0.3, 0.5, 0.3},
+                        {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3},
+                        {0.3, -0.5, -0.3, 0.5, 0.5, 0.3},
+                        },
+        },
+        node_box = {
+                type = "fixed",
+                fixed = {
+                        {-0.3, -0.5, -0.5, 0.3, 0.5, 0.3},
+                        {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3},
+                        {0.3, -0.5, -0.3, 0.5, 0.5, 0.3},
+                        },
+        },
+        groups = groups,
+        })
+        minetest.register_craft({
+                output = recipeitem .. "_technic_cnc_element_t_double 1",
+                recipe = {
+                        {"", "", ""},
+                        {"", recipeitem .. "_technic_cnc_element_t", ""},
+                        {"", recipeitem .. "_technic_cnc_element_t", ""},          
+                },
+        })
+end
+
+
+-- Element Cross Double
+-----------------------
+function technic_cnc_api.register_element_cross_double(recipeitem, groups, images, description)
+
+minetest.register_node(":" .. recipeitem .. "_technic_cnc_element_cross_double", {
+        description = description,
+        drawtype = "nodebox",
+        tiles = images,
+        paramtype = "light",
+        paramtype2 = "facedir",
+        walkable = true,
+        selection_box = {
+                type = "fixed",
+                fixed = {
+                        {0.3, -0.5, -0.3, 0.5, 0.5, 0.3},
+                        {-0.3, -0.5, -0.5, 0.3, 0.5, 0.5},
+                        {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3},
+                        },
+        },
+        node_box = {
+                type = "fixed",
+                fixed = {
+                        {0.3, -0.5, -0.3, 0.5, 0.5, 0.3},
+                        {-0.3, -0.5, -0.5, 0.3, 0.5, 0.5},
+                        {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3},
+                        },
+        },
+        groups = groups,
+        })
+        minetest.register_craft({
+                output = recipeitem .. "_technic_cnc_element_cross_double 1",
+                recipe = {
+                        {"", "", ""},
+                        {"", recipeitem .. "_technic_cnc_element_cross", ""},
+                        {"", recipeitem .. "_technic_cnc_element_cross", ""},              
+                        },
+        })
+
+end
+
+
+-- Element End Double
+---------------------
+function technic_cnc_api.register_element_end_double(recipeitem, groups, images, description)
+
+minetest.register_node(":" .. recipeitem .. "_technic_cnc_element_end_double", {
+        description = description,
+        drawtype = "nodebox",
+        tiles = images,
+        paramtype = "light",
+        paramtype2 = "facedir",
+        walkable = true,
+        selection_box = {
+                type = "fixed",
+                fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.5},
+        },
+        node_box = {
+                type = "fixed",
+                fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.5},
+        },
+        groups = groups,
+        })
+        minetest.register_craft({
+                output = recipeitem .. "_technic_cnc_element_end_double 1",
+                recipe = {
+                        {"", "", ""},
+                        {"", recipeitem .. "_technic_cnc_element_end", ""},
+                        {"", recipeitem .. "_technic_cnc_element_end", ""},                
+                        },
+        })
+end
+
+
+-- STICK
+--------
+function technic_cnc_api.register_stick(recipeitem, groups, images, description)
+
+minetest.register_node(":" .. recipeitem .. "_technic_cnc_stick", {
+        description = description,
+        drawtype = "nodebox",
+        tiles = images,
+        paramtype = "light",
+        paramtype2 = "facedir",
+        walkable = true,
+        selection_box = {
+                type = "fixed",
+                fixed = {-0.15, -0.5, -0.15, 0.15, 0.5, 0.15},
+        },
+        node_box = {
+                type = "fixed",
+                fixed = {-0.15, -0.5, -0.15, 0.15, 0.5, 0.15},
+        },
+        groups = groups,
+        })
+        minetest.register_craft({
+                output = recipeitem .. "_technic_cnc_stick 8",
+                recipe = {
+                        {'default:stick', "", ""},
+                        {"", "", ""},
+                        {recipeitem, "", ""},           
+                },
+        })
+end
+
+
+
+-- REGISTER NEW TECHNIC_CNC_API's PART 2: technic_cnc_api.register_element_end(subname, recipeitem, groups, images, desc_element_xyz)
+-----------------------------------------------------------------------------------------------------------------------
+function technic_cnc_api.register_slope_edge_etc(recipeitem, groups, images, desc_slope, desc_slope_lying, desc_slope_upsdown, desc_slope_edge, desc_slope_inner_edge, desc_slope_upsdwn_edge, desc_slope_upsdwn_inner_edge, desc_pyramid, desc_spike, desc_onecurvededge, desc_twocurvededge, desc_cylinder, desc_cylinder_horizontal, desc_sphere, desc_element_straight, desc_element_edge, desc_element_t, desc_element_cross, desc_element_end)
+
+         technic_cnc_api.register_slope(recipeitem, groups, images, desc_slope)
+         technic_cnc_api.register_slope_lying(recipeitem, groups, images, desc_slope_lying)
+         technic_cnc_api.register_slope_upsdown(recipeitem, groups, images, desc_slope_upsdown)
+         technic_cnc_api.register_slope_edge(recipeitem, groups, images, desc_slope_edge)
+         technic_cnc_api.register_slope_inner_edge(recipeitem, groups, images, desc_slope_inner_edge)
+         technic_cnc_api.register_slope_upsdown_edge(recipeitem, groups, images, desc_slope_upsdwn_edge)
+         technic_cnc_api.register_slope_upsdown_inner_edge(recipeitem, groups, images, desc_slope_upsdwn_inner_edge)
+         technic_cnc_api.register_pyramid(recipeitem, groups, images, desc_pyramid)
+         technic_cnc_api.register_spike(recipeitem, groups, images, desc_spike)
+         technic_cnc_api.register_onecurvededge(recipeitem, groups, images, desc_onecurvededge)
+         technic_cnc_api.register_twocurvededge(recipeitem, groups, images, desc_twocurvededge)
+         technic_cnc_api.register_cylinder(recipeitem, groups, images, desc_cylinder)
+         technic_cnc_api.register_cylinder_horizontal(recipeitem, groups, images, desc_cylinder_horizontal)
+         technic_cnc_api.register_sphere(recipeitem, groups, images, desc_sphere)
+         technic_cnc_api.register_element_straight(recipeitem, groups, images, desc_element_straight)
+         technic_cnc_api.register_element_edge(recipeitem, groups, images, desc_element_edge)
+         technic_cnc_api.register_element_t(recipeitem, groups, images, desc_element_t)
+         technic_cnc_api.register_element_cross(recipeitem, groups, images, desc_element_cross)
+         technic_cnc_api.register_element_end(recipeitem, groups, images, desc_element_end)
+end
+
+-- REGISTER STICKS: noncubic.register_xyz(recipeitem, groups, images, desc_element_xyz)
+------------------------------------------------------------------------------------------------------------
+function technic_cnc_api.register_stick_etc(recipeitem, groups, images, desc_stick)
+         technic_cnc_api.register_stick(recipeitem, groups, images, desc_stick)
+end
+
+function technic_cnc_api.register_elements(recipeitem, groups, images, desc_element_straight_double, desc_element_edge_double, desc_element_t_double, desc_element_cross_double, desc_element_end_double)
+         technic_cnc_api.register_element_straight_double(recipeitem, groups, images, desc_element_straight_double)
+         technic_cnc_api.register_element_edge_double(recipeitem, groups, images, desc_element_edge_double)
+         technic_cnc_api.register_element_t_double(recipeitem, groups, images, desc_element_t_double)
+         technic_cnc_api.register_element_cross_double(recipeitem, groups, images, desc_element_cross_double)
+         technic_cnc_api.register_element_end_double(recipeitem, groups, images, desc_element_end_double)
+end
diff --git a/technic/cnc_nodes.lua b/technic/cnc_nodes.lua
new file mode 100644 (file)
index 0000000..2f375a5
--- /dev/null
@@ -0,0 +1,354 @@
+-- REGISTER MATERIALS AND PROPERTIES FOR NONCUBIC ELEMENTS:
+-----------------------------------------------------------
+
+-- WOOD
+-------
+technic_cnc_api.register_slope_edge_etc("default:wood",
+                {snappy=2,choppy=2,oddly_breakable_by_hand=2,not_in_creative_inventory=1},
+                {"default_wood.png"},
+                "Wooden Slope",
+                "Wooden Slope Lying",
+                "Wooden Slope Upside Down",
+                "Wooden Slope Edge",
+                "Wooden Slope Inner Edge",
+                "Wooden Slope Upside Down Edge",
+                "Wooden Slope Upside Down Inner Edge",
+                "Wooden Pyramid",
+                "Wooden Spike",
+                "Wooden One Curved Edge Block",
+                "Wooden Two Curved Edge Block",
+                "Wooden Cylinder",
+                "Wooden Cylinder Horizontal",
+                "Wooden Sphere",
+                "Wooden Element Straight",
+                "Wooden Element Edge",
+                "Wooden Element T",
+                "Wooden Element Cross",
+                "Wooden Element End")
+-- STONE
+--------
+technic_cnc_api.register_slope_edge_etc("default:stone",
+                {cracky=3,not_in_creative_inventory=1},
+                {"default_stone.png"},
+                "Stone Slope",
+                "Stone Slope Lying",
+                "Stone Slope Upside Down",
+                "Stone Slope Edge",
+                "Stone Slope Inner Edge",
+                "Stone Slope Upside Down Edge",
+                "Stone Slope Upside Down Inner Edge",
+                "Stone Pyramid",
+                "Stone Spike",
+                "Stone One Curved Edge Block",
+                "Stone Two Curved Edge Block",
+                "Stone Cylinder",
+                "Stote Cylinder Horizontal",
+                "Stone Sphere",
+                "Stone Element Straight",
+                "Stone Element Edge",
+                "Stone Element T",
+                "Stone Element Cross",
+                "Stone Element End")
+-- COBBLE
+---------
+technic_cnc_api.register_slope_edge_etc("default:cobble",
+                {cracky=3,not_in_creative_inventory=1},
+                {"default_cobble.png"},
+                "Cobble Slope",
+                "Cobble Slope Lying",
+                "Cobble Slope Upside Down",
+                "Cobble Slope Edge",
+                "Cobble Slope Inner Edge",
+                "Cobble Slope Upside Down Edge",
+                "Cobble Slope Upside Down Inner Edge",
+                "Cobble Pyramid",
+                "Cobble Spike",
+                "Cobble One Curved Edge Block",
+                "Cobble Two Curved Edge Block",
+                "Cobble Cylinder",
+                "Cobble Cylinder Horizontal",
+                "Cobble Sphere",
+                "Cobble Element Straight",
+                "Cobble Element Edge",
+                "Cobble Element T",
+                "Cobble Element Cross",
+                "Cobble Element End")
+-- BRICK
+--------
+technic_cnc_api.register_slope_edge_etc("default:brick",
+                {cracky=3,not_in_creative_inventory=1},
+                {"default_brick.png"},
+                "Brick Slope",
+                "Brick Slope Upside Down",
+                "Brick Slope Edge",
+                "Brick Slope Inner Edge",
+                "Brick Slope Upside Down Edge",
+                "Brick Slope Upside Down Inner Edge",
+                "Brick Pyramid",
+                "Brick Spike",
+                "Brick One Curved Edge Block",
+                "Brick Two Curved Edge Block",
+                "Brick Cylinder",
+                "Brick Cylinder Horizontal",
+                "Brick Sphere",
+                "Brick Element Straight",
+                "Brick Element Edge",
+                "Brick Element T",
+                "Brick Element Cross",
+                "Brick Element End")
+-- SANDSTONE
+------------
+technic_cnc_api.register_slope_edge_etc("default:sandstone",
+                {crumbly=2,cracky=2,not_in_creative_inventory=1},
+                {"default_sandstone.png"},
+                "Sandstone Slope",
+                "Sandstone Slope Lying",
+                "Sandstone Slope Upside Down",
+                "Sandstone Slope Edge",
+                "Sandstone Slope Inner Edge",
+                "Sandstone Slope Upside Down Edge",
+                "Sandstone Slope Upside Down Inner Edge",
+                "Sandstone Pyramid",
+                "Sandstone Spike",
+                "Sandstone One Curved Edge Block",
+                "Sandstone Two Curved Edge Block",
+                "Sandstone Cylinder",
+                "Sandstone Cylinder Horizontal",
+                "Sandstone Sphere",
+                "Sandstone Element Straight",
+                "Sandstone Element Edge",
+                "Sandstone Element T",
+                "Sandstone Element Cross",
+                "Sandstone Element End")
+-- LEAVES
+---------
+technic_cnc_api.register_slope_edge_etc("default:leaves",
+                {snappy=2,choppy=2,oddly_breakable_by_hand=3,not_in_creative_inventory=1},
+                {"bucharest_tree.png"},
+                "Leaves Slope",
+                "Leaves Slope Lying",
+                "Leaves Slope Upside Down",
+                "Leaves Slope Edge",
+                "Leaves Slope Inner Edge",
+                "Leaves Slope Upside Down Edge",
+                "Leaves Slope Upside Down Inner Edge",
+                "Leaves Pyramid",
+                "Leaves Spike",
+                "Leaves One Curved Edge Block",
+                "Leaves Two Curved Edge Block",
+                "Leaves Cylinder",
+                "Leaves Cylinder Horizontal",
+                "Leaves Sphere",
+                "Leaves Element Straight",
+                "Leaves Element Edge",
+                "Leaves Element T",
+                "Leaves Element Cross",
+                "Leaves Element End")
+-- DIRT
+-------
+technic_cnc_api.register_slope_edge_etc("default:dirt",
+                {snappy=2,choppy=2,oddly_breakable_by_hand=3,not_in_creative_inventory=1},
+                {"default_grass.png", "default_dirt.png", "default_grass.png"},
+                "Dirt Slope",
+                "Dirt Slope Lying",
+                "Dirt Slope Upside Down",
+                "Dirt Slope Edge",
+                "Dirt Slope Inner Edge",
+                "Dirt Slope Upside Down Edge",
+                "Dirt Slope Upside Down Inner Edge",
+                "Dirt Pyramid",
+                "Dirt Spike",
+                "Dirt One Curved Edge Block",
+                "Dirt Two Curved Edge Block",
+                "Dirt Cylinder",
+                "Dirt Cylinder Horizontal",
+                "Dirt Sphere",
+                "Dirt Element Straight",
+                "Dirt Element Edge",
+                "Dirt Element T",
+                "Dirt Element Cross",
+                "Dirt Element End")
+-- TREE
+-------
+technic_cnc_api.register_slope_edge_etc("default:tree",
+                {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3,not_in_creative_inventory=1},
+                {"default_tree.png"},
+                "Tree Slope",
+                "Tree Slope Lying",
+                "Tree Slope Upside Down",
+                "Tree Slope Edge",
+                "Tree Slope Inner Edge",
+                "Tree Slope Upside Down Edge",
+                "Tree Slope Upside Down Inner Edge",
+                "Tree Pyramid",
+                "Tree Spike",
+                "Tree One Curved Edge Block",
+                "Tree Two Curved Edge Block",
+                "Tree Cylinder",
+                "Tree Cylinder Horizontal",
+                "Tree Sphere",
+                "Tree Element Straight",
+                "Tree Element Edge",
+                "Tree Element T",
+                "Tree Element Cross",
+                "Tree Element End")
+-- STEEL
+--------
+technic_cnc_api.register_slope_edge_etc("default:steelblock",
+                {snappy=1,bendy=2,cracky=1,melty=2,level=2,not_in_creative_inventory=1},
+                {"default_steel_block.png"},
+                "Steel Slope",
+                "Steel Slope Lying",
+                "Steel Slope Upside Down",
+                "Steel Slope Edge",
+                "Steel Slope Inner Edge",
+                "Steel Slope Upside Down Edge",
+                "Steel Slope Upside Down Inner Edge",
+                "Steel Pyramid",
+                "Steel Spike",
+                "Steel One Curved Edge Block",
+                "Steel Two Curved Edge Block",
+                "Steel Cylinder",
+                "Steel Cylinder Horizontal",
+                "Steel Sphere",
+                "Steel Element Straight",
+                "Steel Element Edge",
+                "Steel Element T",
+                "Steel Element Cross",
+                "Steel Element End")
+
+-- REGISTER MATERIALS AND PROPERTIES FOR STICKS:
+------------------------------------------------
+
+-- WOOD
+-------
+technic_cnc_api.register_stick_etc("default:wood",
+                {snappy=2,choppy=2,oddly_breakable_by_hand=2,not_in_creative_inventory=1},
+                {"default_wood.png"},
+                "Wooden Stick")
+-- STONE
+--------
+technic_cnc_api.register_stick_etc("default:stone",
+                {cracky=3,not_in_creative_inventory=1},
+                {"default_stone.png"},
+                "Stone Stick")
+-- COBBLE
+---------
+technic_cnc_api.register_stick_etc("default:cobble",
+                {cracky=3,not_in_creative_inventory=1},
+                {"default_cobble.png"},
+                "Cobble Stick")
+-- BRICK
+--------
+technic_cnc_api.register_stick_etc("default:brick",
+                {cracky=3,not_in_creative_inventory=1},
+                {"default_brick.png"},
+                "Brick Stick")
+-- SANDSTONE
+------------
+technic_cnc_api.register_stick_etc("default:sandstone",
+                {crumbly=2,cracky=2,not_in_creative_inventory=1},
+                {"default_sandstone.png"},
+                "Sandstone Stick")
+-- LEAVES
+---------
+technic_cnc_api.register_stick_etc("default:leaves",
+                {snappy=2,choppy=2,oddly_breakable_by_hand=3,not_in_creative_inventory=1},
+                {"bucharest_tree.png"},
+                "Leaves Stick")
+-- TREE
+-------
+technic_cnc_api.register_stick_etc("default:tree",
+                {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1,not_in_creative_inventory=1},
+                {"default_tree.png"},
+                "Tree Stick")
+-- STEEL
+--------
+technic_cnc_api.register_stick_etc("default:steelblock",
+                {snappy=1,bendy=2,cracky=1,melty=2,level=2,not_in_creative_inventory=1},
+                {"default_steel_block.png"},
+                "Steel Stick")
+
+-- REGISTER MATERIALS AND PROPERTIES FOR HALF AND NORMAL HEIGHT ELEMENTS:
+-------------------------------------------------------------------------
+
+-- WOOD
+-------
+technic_cnc_api.register_elements("default:wood",
+                {snappy=2,choppy=2,oddly_breakable_by_hand=2,not_in_creative_inventory=1},
+                {"default_wood.png"},
+                "Wooden Element Straight Double",
+                "Wooden Element Edge Double",
+                "Wooden Element T Double",
+                "Wooden Element Cross Double",
+                "Wooden Element End Double")
+-- STONE
+--------
+technic_cnc_api.register_elements("default:stone",
+                {cracky=3,not_in_creative_inventory=1},
+                {"default_stone.png"},
+                "Stone Element Straight Double",
+                "Stone Element Edge Double",
+                "Stone Element T Double",
+                "Stone Element Cross Double",
+                "Stone Element End Double")
+-- COBBLE
+---------
+technic_cnc_api.register_elements("default:cobble",
+                {cracky=3,not_in_creative_inventory=1},
+                {"default_cobble.png"},
+                "Cobble Element Straight Double",
+                "Cobble Element Edge Double",
+                "Cobble Element T Double",
+                "Cobble Element Cross Double",
+                "Cobble Element End Double")
+-- BRICK
+--------
+technic_cnc_api.register_elements("default:brick",
+                {cracky=3,not_in_creative_inventory=1},
+                {"default_brick.png"},
+                "Brick Element Straight Double",
+                "Brick Element Edge Double",
+                "Brick Element T Double",
+                "Brick Element Cross Double",
+                "Brick Element End Double")
+-- SANDSTONE
+------------
+technic_cnc_api.register_elements("default:sandstone",
+                {crumbly=2,cracky=2,not_in_creative_inventory=1},
+                {"default_sandstone.png"},
+                "Sandstone Element Straight Double",
+                "Sandstone Element Edge Double",
+                "Sandstone Element T Double",
+                "Sandstone Element Cross Double",
+                "Sandstone Element End Double")
+-- LEAVES
+---------
+technic_cnc_api.register_elements("default:leaves",
+                {snappy=2,choppy=2,oddly_breakable_by_hand=3,not_in_creative_inventory=1},
+                {"bucharest_tree.png"},
+                "Leaves Element Straight Double",
+                "Leaves Element Edge Double",
+                "Leaves Element T Double",
+                "Leaves Element Cross Double",
+                "Leaves Element End Double")
+-- TREE
+-------
+technic_cnc_api.register_elements("default:tree",
+                {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1,not_in_creative_inventory=1},
+                {"default_tree.png"},
+                "Tree Element Straight Double",
+                "Tree Element Edge Double",
+                "Tree Element T Double",
+                "Tree Element Cross Double",
+                "Tree Element End Double")
+-- STEEL
+--------
+technic_cnc_api.register_elements("default:steel",
+                {snappy=1,bendy=2,cracky=1,melty=2,level=2,not_in_creative_inventory=1},
+                {"default_steel_block.png"},
+                "Steel Element Straight Double",
+                "Steel Element Edge Double",
+                "Steel Element T Double",
+                "Steel Element Cross Double",
+                "Steel Element End Double")
index 58e0488159f47b653385daad5109d4c49a1954bc..ff904e26af875cd1f364f277aa5c68d14e1167ad 100644 (file)
@@ -2,6 +2,8 @@
 -- namespace: technic
 -- (c) 2012-2013 by RealBadAngel <mk@realbadangel.pl>
 
+technic = {}
+
 modpath=minetest.get_modpath("technic")
 
 --Read technic config file
@@ -25,6 +27,9 @@ dofile(modpath.."/tool_workshop.lua")
 dofile(modpath.."/music_player.lua")
 dofile(modpath.."/generator.lua")
 dofile(modpath.."/grinder.lua")
+dofile(modpath.."/cnc.lua")
+dofile(modpath.."/cnc_api.lua")
+dofile(modpath.."/cnc_nodes.lua")
 
 --MV machines
 dofile(modpath.."/wires_mv.lua")
@@ -34,10 +39,13 @@ dofile(modpath.."/electric_furnace_mv.lua")
 dofile(modpath.."/alloy_furnace_mv.lua")
 dofile(modpath.."/forcefield.lua")
 
+--HV machines
+dofile(modpath.."/wires_hv.lua")
+
 --Tools
-if enable_mining_drill==true then dofile(modpath.."/mining_drill.lua") end
-if enable_mining_laser==true then dofile(modpath.."/mining_laser_mk1.lua") end
-if enable_flashlight==true then dofile(modpath.."/flashlight.lua") end
+if technic.config:getBool("enable_mining_drill") then dofile(modpath.."/mining_drill.lua") end
+if technic.config:getBool("enable_mining_laser") then dofile(modpath.."/mining_laser_mk1.lua") end
+if technic.config:getBool("enable_flashlight") then dofile(modpath.."/flashlight.lua") end
 dofile(modpath.."/cans.lua")
 dofile(modpath.."/chainsaw.lua")
 dofile(modpath.."/tree_tap.lua")
diff --git a/technic/textures/technic_cnc_bottom.png b/technic/textures/technic_cnc_bottom.png
new file mode 100644 (file)
index 0000000..e600cb1
Binary files /dev/null and b/technic/textures/technic_cnc_bottom.png differ
diff --git a/technic/textures/technic_cnc_cylinder.png b/technic/textures/technic_cnc_cylinder.png
new file mode 100644 (file)
index 0000000..06da024
Binary files /dev/null and b/technic/textures/technic_cnc_cylinder.png differ
diff --git a/technic/textures/technic_cnc_cylinder_horizontal.png b/technic/textures/technic_cnc_cylinder_horizontal.png
new file mode 100644 (file)
index 0000000..670ecf2
Binary files /dev/null and b/technic/textures/technic_cnc_cylinder_horizontal.png differ
diff --git a/technic/textures/technic_cnc_element_cross.png b/technic/textures/technic_cnc_element_cross.png
new file mode 100644 (file)
index 0000000..f2ad0b7
Binary files /dev/null and b/technic/textures/technic_cnc_element_cross.png differ
diff --git a/technic/textures/technic_cnc_element_edge.png b/technic/textures/technic_cnc_element_edge.png
new file mode 100644 (file)
index 0000000..e6104cf
Binary files /dev/null and b/technic/textures/technic_cnc_element_edge.png differ
diff --git a/technic/textures/technic_cnc_element_end.png b/technic/textures/technic_cnc_element_end.png
new file mode 100644 (file)
index 0000000..6bc6837
Binary files /dev/null and b/technic/textures/technic_cnc_element_end.png differ
diff --git a/technic/textures/technic_cnc_element_straight.png b/technic/textures/technic_cnc_element_straight.png
new file mode 100644 (file)
index 0000000..1648b7b
Binary files /dev/null and b/technic/textures/technic_cnc_element_straight.png differ
diff --git a/technic/textures/technic_cnc_element_t.png b/technic/textures/technic_cnc_element_t.png
new file mode 100644 (file)
index 0000000..0d49cd8
Binary files /dev/null and b/technic/textures/technic_cnc_element_t.png differ
diff --git a/technic/textures/technic_cnc_front.png b/technic/textures/technic_cnc_front.png
new file mode 100644 (file)
index 0000000..6cc0490
Binary files /dev/null and b/technic/textures/technic_cnc_front.png differ
diff --git a/technic/textures/technic_cnc_full.png b/technic/textures/technic_cnc_full.png
new file mode 100644 (file)
index 0000000..d551a45
Binary files /dev/null and b/technic/textures/technic_cnc_full.png differ
diff --git a/technic/textures/technic_cnc_half.png b/technic/textures/technic_cnc_half.png
new file mode 100644 (file)
index 0000000..51ebcd7
Binary files /dev/null and b/technic/textures/technic_cnc_half.png differ
diff --git a/technic/textures/technic_cnc_milling_background.png b/technic/textures/technic_cnc_milling_background.png
new file mode 100644 (file)
index 0000000..6a9c2f4
Binary files /dev/null and b/technic/textures/technic_cnc_milling_background.png differ
diff --git a/technic/textures/technic_cnc_onecurvededge.png b/technic/textures/technic_cnc_onecurvededge.png
new file mode 100644 (file)
index 0000000..46779fd
Binary files /dev/null and b/technic/textures/technic_cnc_onecurvededge.png differ
diff --git a/technic/textures/technic_cnc_pyramid.png b/technic/textures/technic_cnc_pyramid.png
new file mode 100644 (file)
index 0000000..5dc3322
Binary files /dev/null and b/technic/textures/technic_cnc_pyramid.png differ
diff --git a/technic/textures/technic_cnc_side.png b/technic/textures/technic_cnc_side.png
new file mode 100644 (file)
index 0000000..1ecbbac
Binary files /dev/null and b/technic/textures/technic_cnc_side.png differ
diff --git a/technic/textures/technic_cnc_slope.png b/technic/textures/technic_cnc_slope.png
new file mode 100644 (file)
index 0000000..083ae18
Binary files /dev/null and b/technic/textures/technic_cnc_slope.png differ
diff --git a/technic/textures/technic_cnc_slope_edge.png b/technic/textures/technic_cnc_slope_edge.png
new file mode 100644 (file)
index 0000000..785adf6
Binary files /dev/null and b/technic/textures/technic_cnc_slope_edge.png differ
diff --git a/technic/textures/technic_cnc_slope_edge_upsdwn.png b/technic/textures/technic_cnc_slope_edge_upsdwn.png
new file mode 100644 (file)
index 0000000..5adb788
Binary files /dev/null and b/technic/textures/technic_cnc_slope_edge_upsdwn.png differ
diff --git a/technic/textures/technic_cnc_slope_inner_edge.png b/technic/textures/technic_cnc_slope_inner_edge.png
new file mode 100644 (file)
index 0000000..906dd25
Binary files /dev/null and b/technic/textures/technic_cnc_slope_inner_edge.png differ
diff --git a/technic/textures/technic_cnc_slope_inner_edge_upsdwn.png b/technic/textures/technic_cnc_slope_inner_edge_upsdwn.png
new file mode 100644 (file)
index 0000000..0ae0e14
Binary files /dev/null and b/technic/textures/technic_cnc_slope_inner_edge_upsdwn.png differ
diff --git a/technic/textures/technic_cnc_slope_lying.png b/technic/textures/technic_cnc_slope_lying.png
new file mode 100644 (file)
index 0000000..377769a
Binary files /dev/null and b/technic/textures/technic_cnc_slope_lying.png differ
diff --git a/technic/textures/technic_cnc_slope_upsdwn.png b/technic/textures/technic_cnc_slope_upsdwn.png
new file mode 100644 (file)
index 0000000..b802b60
Binary files /dev/null and b/technic/textures/technic_cnc_slope_upsdwn.png differ
diff --git a/technic/textures/technic_cnc_sphere.png b/technic/textures/technic_cnc_sphere.png
new file mode 100644 (file)
index 0000000..69ada47
Binary files /dev/null and b/technic/textures/technic_cnc_sphere.png differ
diff --git a/technic/textures/technic_cnc_spike.png b/technic/textures/technic_cnc_spike.png
new file mode 100644 (file)
index 0000000..92e6e58
Binary files /dev/null and b/technic/textures/technic_cnc_spike.png differ
diff --git a/technic/textures/technic_cnc_stick.png b/technic/textures/technic_cnc_stick.png
new file mode 100644 (file)
index 0000000..8dfe408
Binary files /dev/null and b/technic/textures/technic_cnc_stick.png differ
diff --git a/technic/textures/technic_cnc_top.png b/technic/textures/technic_cnc_top.png
new file mode 100644 (file)
index 0000000..5123334
Binary files /dev/null and b/technic/textures/technic_cnc_top.png differ
diff --git a/technic/textures/technic_cnc_twocurvededge.png b/technic/textures/technic_cnc_twocurvededge.png
new file mode 100644 (file)
index 0000000..3219a90
Binary files /dev/null and b/technic/textures/technic_cnc_twocurvededge.png differ