kpoppel
2013-05-07 fef948c5ac919082fa30d441ec62d6d1d0d2c98b
CNC can now change programs while it is working.
2 files modified
132 ■■■■ changed files
technic/battery_box.lua 4 ●●●● patch | view | raw | blame | history
technic/cnc.lua 128 ●●●● patch | view | raw | blame | history
technic/battery_box.lua
@@ -218,7 +218,7 @@
        end    
    end
    
-- dischargin registered power tools
-- discharging registered power tools
        if inv:is_empty("dst") == false then 
        srcstack = inv:get_stack("dst", 1)
        src_item=srcstack:to_table()
@@ -297,7 +297,7 @@
local pos1={}
i=1
    repeat
    if PR_nodes[i]==nil then break end -- gettin power from all connected producers
    if PR_nodes[i]==nil then break end -- getting power from all connected producers
        pos1.x=PR_nodes[i].x
        pos1.y=PR_nodes[i].y
        pos1.z=PR_nodes[i].z
technic/cnc.lua
@@ -1,5 +1,11 @@
-- Technic CNC v1.0 by kpo
-- Based on the NonCubic Blocks MOD v1.4 by yves_de_beck
-- Idea:
--   Somehw have a tabbed/paged panel if the number of shapes should expand
--   beyond what is available in the panel today.
--   I could imagine some form of API allowing modders to come with their own node
--   box definitions and easily stuff it in the this machine for production.
local shape = {}
local onesize_products = {
   slope                    = 2,
@@ -89,61 +95,9 @@
local size     = 1;
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 = {cracky=2},
    legacy_facedir_simple = true,
    technic_power_machine=1,
    internal_EU_buffer=0;
    internal_EU_buffer_size=5000;
    cnc_time = 0;
    src_time = 0; -- fixme
    on_construct = function(pos)
              local meta = minetest.env:get_meta(pos)
              meta:set_string("infotext", "CNC machine")
              meta:set_float("technic_power_machine", 1)
              meta:set_float("internal_EU_buffer", 0)
              meta:set_float("internal_EU_buffer_size", 5000)
              meta:set_string("formspec", cnc_formspec..cnc_power_formspec)
              meta:set_float("cnc_time", 0)
              local inv = meta:get_inventory()
              inv:set_size("src", 1)
              inv:set_size("dst", 4)
              meta:set_string("formspec", cnc_formspec)
              meta:set_string("infotext", "CNC Milling Machine")
               end,
    can_dig = function(pos,player)
             local meta = minetest.env:get_meta(pos);
             local inv = meta:get_inventory()
             if not inv:is_empty("src") or not inv:is_empty("dst") 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_receive_fields = function(pos, formname, fields, sender)
-- The form handler is declared here because we need it in both the inactive and active modes
-- in order to be able to change programs wile it is running.
local form_handler = function(pos, formname, fields, sender)
                   -- REGISTER MILLING PROGRAMS AND OUTPUTS:
                   ------------------------------------------
                   -- Program for half/full size
@@ -178,22 +132,78 @@
                  if onesize_products[k] ~= nil or (twosize_products[k] ~= nil and size==2) then
                     meta:set_string("cnc_product",  inputname .. "_technic_cnc_" .. k)
                     print(inputname .. "_technic_cnc_" .. k)
                     break
                  end
                  if twosize_products[k] ~= nil and size==1 then
                     meta:set_string("cnc_product",  inputname .. "_technic_cnc_" .. k .. "_double")
                     print(inputname .. "_technic_cnc_" .. k .. "_double")
                     break
                  end
                   end
                   return
                end, -- callback function
                end -- callback function
-- The actual block inactive state
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 = {cracky=2},
    legacy_facedir_simple = true,
    technic_power_machine=1,
    internal_EU_buffer=0;
    internal_EU_buffer_size=5000;
    cnc_time = 0;
    src_time = 0; -- fixme
    on_construct = function(pos)
              local meta = minetest.env:get_meta(pos)
              meta:set_string("infotext", "CNC Machine Inactive")
              meta:set_float("technic_power_machine", 1)
              meta:set_float("internal_EU_buffer", 0)
              meta:set_float("internal_EU_buffer_size", 5000)
              meta:set_string("formspec", cnc_formspec..cnc_power_formspec)
              meta:set_float("cnc_time", 0)
              local inv = meta:get_inventory()
              inv:set_size("src", 1)
              inv:set_size("dst", 4)
               end,
    can_dig = function(pos,player)
             local meta = minetest.env:get_meta(pos);
             local inv = meta:get_inventory()
             if not inv:is_empty("src") or not inv:is_empty("dst") 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_receive_fields = form_handler,
     })
-- Active state block
minetest.register_node("technic:cnc_active", {
    description = "CNC 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_active.png"},
        tiles       = {"technic_cnc_top_active.png", "technic_cnc_bottom.png", "technic_cnc_side.png",
               "technic_cnc_side.png",       "technic_cnc_side.png",   "technic_cnc_front_active.png"},
    paramtype2 = "facedir",
    groups = {cracky=2,not_in_creative_inventory=1},
    legacy_facedir_simple = true,
@@ -206,8 +216,10 @@
             end
             return true
          end,
    on_receive_fields = form_handler,
})
-- Action code performing the transformation
minetest.register_abm(
   {
      nodenames = {"technic:cnc","technic:cnc_active"},