CNC can now change programs while it is working.

This commit is contained in:
kpoppel 2013-05-07 22:51:03 +02:00
parent 7f2be244f2
commit fef948c5ac
2 changed files with 72 additions and 60 deletions

View File

@ -218,7 +218,7 @@ minetest.register_abm({
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 @@ table_index=1
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

View File

@ -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 cnc_power_formspec=
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 @@ minetest.register_node("technic:cnc", {
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 @@ minetest.register_node("technic:cnc_active", {
end
return true
end,
on_receive_fields = form_handler,
})
-- Action code performing the transformation
minetest.register_abm(
{
nodenames = {"technic:cnc","technic:cnc_active"},