From 410afaa58369cdcdf1fce598addb7cc74aaff074 Mon Sep 17 00:00:00 2001
From: RealBadAngel <mk@realbadangel.pl>
Date: Mon, 15 Jul 2013 20:21:49 +0200
Subject: [PATCH] Add compressor

---
 technic/machines/lv/init.lua       |    2 
 technic/machines/lv/compressor.lua |  207 +++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 208 insertions(+), 1 deletions(-)

diff --git a/technic/machines/lv/compressor.lua b/technic/machines/lv/compressor.lua
new file mode 100644
index 0000000..41eb947
--- /dev/null
+++ b/technic/machines/lv/compressor.lua
@@ -0,0 +1,207 @@
+technic.compressor_recipes ={}
+
+technic.register_compressor_recipe = function(src, src_count, dst, dst_count)
+	technic.compressor_recipes[src] = {src_count = src_count, dst_name = dst, dst_count = dst_count}
+	if unified_inventory then
+		unified_inventory.register_craft(
+		{
+			type = "compressing",
+			output = dst.." "..dst_count,
+			items = {src.." "..src_count},
+			width = 0,
+		})
+	end
+end
+
+technic.get_compressor_recipe = function(item)
+	if technic.compressor_recipes[item.name] and 
+	   item.count >= technic.compressor_recipes[item.name].src_count then
+		return technic.compressor_recipes[item.name]
+	else
+		return nil
+	end
+end
+
+technic.register_compressor_recipe("default:snowblock",		1,	"default:ice",		1)
+technic.register_compressor_recipe("default:sand",		1,	"default:sandstone",	1)
+technic.register_compressor_recipe("default:desert_sand",	1,	"default:desert_stone",	1)
+technic.register_compressor_recipe("technic:mixed_metal_ingot",	1,	"technic:composite_plate",	1)
+technic.register_compressor_recipe("default:copper_ingot",	5,	"technic:copper_plate",	1)
+technic.register_compressor_recipe("technic:coal_dust",		4,	"technic:graphite",	1)
+technic.register_compressor_recipe("technic:carbon_cloth",	1,	"technic:carbon_plate",	1)
+
+
+minetest.register_alias("compressor", "technic:compressor")
+minetest.register_craft({
+	output = 'technic:compressor',
+	recipe = {
+		{'default:stone',	'default:stone',	'default:stone'},
+		{'mesecons:piston',	'technic:motor',	'mesecons:piston'},
+		{'default:stone',	'technic:lv_cable',	'default:stone'},
+	}
+})
+
+minetest.register_craftitem("technic:compressor", {
+	description = "Compressor",
+	stack_max = 99,
+})
+
+local compressor_formspec =
+	"invsize[8,9;]"..
+	"label[0,0;Compressor]"..
+	"list[current_name;src;3,1;1,1;]"..
+	"list[current_name;dst;5,1;2,2;]"..
+	"list[current_player;main;0,5;8,4;]"
+
+minetest.register_node("technic:compressor", {
+	description = "Compressor",
+	tiles = {"technic_compressor_top.png", "technic_compressor_bottom.png", "technic_compressor_side.png",
+	       "technic_compressor_side.png", "technic_compressor_back.png", "technic_compressor_front.png"},
+	paramtype2 = "facedir",
+	groups = {cracky=2},
+	legacy_facedir_simple = true,
+	sounds = default.node_sound_wood_defaults(),
+	on_construct = function(pos)
+		local meta = minetest.env:get_meta(pos)
+		meta:set_string("infotext", "Compressor")
+		meta:set_float("technic_power_machine", 1)
+		meta:set_string("formspec", compressor_formspec)
+		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(), "Machine cannot be removed because it is not empty");
+			return false
+		else
+			return true
+		end
+	end,
+})
+
+minetest.register_node("technic:compressor_active", {
+	description = "Compressor",
+	tiles = {"technic_compressor_top.png", "technic_compressor_bottom.png", "technic_compressor_side.png",
+	       "technic_compressor_side.png", "technic_compressor_back.png", "technic_compressor_front_active.png"},
+	paramtype2 = "facedir",
+	groups = {cracky=2,not_in_creative_inventory=1},
+	legacy_facedir_simple = true,
+	sounds = default.node_sound_wood_defaults(),
+	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(), "Machine cannot be removed because it is not empty");
+			return false
+		else
+			return true
+		end
+	end,
+})
+
+minetest.register_abm({
+	nodenames = {"technic:compressor","technic:compressor_active"},
+	interval = 1,
+	chance   = 1,
+	action = function(pos, node, active_object_count, active_object_count_wider)
+		-- Run a machine through its states. Takes the same arguments as the ABM action
+		-- and adds the machine's states and any extra data which is needed by the machine.
+		-- A machine is characterized by running through a set number of states (usually 2:
+		-- Idle and active) in some order. A state decides when to move to the next one
+		-- and the machine only changes state if it is powered correctly.
+		-- The machine will automatically shut down if disconnected from power in some fashion.
+		local meta         = minetest.env:get_meta(pos)
+		local eu_input     = meta:get_int("LV_EU_input")
+		local state        = meta:get_int("state")
+		local next_state   = state
+
+		-- Machine information
+		local machine_name         = "Compressor"
+		local machine_node         = "technic:compressor"
+		local machine_state_demand = { 50, 300 }
+ 
+		 -- Setup meta data if it does not exist. state is used as an indicator of this
+		if state == 0 then
+			meta:set_int("state", 1)
+			meta:set_int("LV_EU_demand", machine_state_demand[1])
+			meta:set_int("LV_EU_input", 0)
+			return
+		end
+ 
+		-- Power off automatically if no longer connected to a switching station
+		technic.switching_station_timeout_count(pos, "LV")
+ 
+		-- State machine
+		if eu_input == 0 then
+			-- unpowered - go idle
+			hacky_swap_node(pos, machine_node)
+			meta:set_string("infotext", machine_name.." Unpowered")
+			next_state = 1
+		elseif eu_input == machine_state_demand[state] then
+			-- Powered - do the state specific actions
+			    
+			local inv    = meta:get_inventory()
+			local empty  = inv:is_empty("src")
+			local srcstack  = inv:get_stack("src", 1)
+			local src_item = nil
+			local recipe = nil
+			local result = nil
+ 
+			if srcstack then
+				src_item = srcstack:to_table()
+			end
+			if src_item then
+				recipe = technic.get_compressor_recipe(src_item)
+			end
+			if recipe then
+				result = {name=recipe.dst_name, count=recipe.dst_count}
+			end 
+
+			if state == 1 then
+				hacky_swap_node(pos, machine_node)
+				meta:set_string("infotext", machine_name.." Idle")
+
+				if not empty and result and inv:room_for_item("dst",result) then
+					meta:set_int("src_time", 0)
+					next_state = 2
+				end
+			elseif state == 2 then
+				hacky_swap_node(pos, machine_node.."_active")
+				meta:set_string("infotext", machine_name.." Active")
+
+				if empty then
+					next_state = 1
+				else
+					meta:set_int("src_time", meta:get_int("src_time") + 1)
+					if meta:get_int("src_time") == 4 then 
+						-- 4 ticks per output
+						-- check if there's room for output in "dst" list
+
+						meta:set_int("src_time", 0)
+						if recipe and inv:room_for_item("dst",result) then
+							-- take stuff from "src" list
+							srcstack:take_item(recipe.src_count)
+							inv:set_stack("src", 1, srcstack)
+							-- Put result in "dst" list
+							inv:add_item("dst", result)
+						else
+							-- all full: go idle
+							next_state = 1
+						end
+					end
+				end
+			end
+		end
+		-- Change state?
+		if next_state ~= state then
+			meta:set_int("LV_EU_demand", machine_state_demand[next_state])
+			meta:set_int("state", next_state)
+		end
+	end
+})
+
+technic.register_LV_machine ("technic:compressor","RE")
+technic.register_LV_machine ("technic:compressor_active","RE")
diff --git a/technic/machines/lv/init.lua b/technic/machines/lv/init.lua
index a95f78e..a82c3ec 100644
--- a/technic/machines/lv/init.lua
+++ b/technic/machines/lv/init.lua
@@ -16,4 +16,4 @@
 dofile(path.."/cnc_api.lua")
 dofile(path.."/cnc_nodes.lua")
 dofile(path.."/extractor.lua")
-
+dofile(path.."/compressor.lua")

--
Gitblit v1.8.0