summaryrefslogtreecommitdiff
path: root/technic/electric_furnace.lua
blob: 0c1f43ebfe3ed9cc1ba959e6dc58ee912b6d5f8b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
-- LV Electric Furnace
-- This is a faster version of the stone furnace which runs on EUs

-- FIXME: kpoppel I'd like to introduce an induction heating element here also
minetest.register_craft(
   {output = 'technic:electric_furnace',
    recipe = {
       {'default:cobble',      'default:cobble',        'default:cobble'},
       {'default:cobble',      '',                      'default:cobble'},
       {'default:steel_ingot', 'moreores:copper_ingot', 'default:steel_ingot'},
    }
 })

local electric_furnace_formspec =
   "invsize[8,9;]"..
   "list[current_name;src;3,1;1,1;]"..
   "list[current_name;dst;5,1;2,2;]"..
   "list[current_player;main;0,5;8,4;]"..
   "label[0,0;Electric Furnace]"..
   "label[1,3;Power level]"

minetest.register_node(
   "technic:electric_furnace",
   {description = "Electric furnace",
    tiles = {"technic_electric_furnace_top.png", "technic_electric_furnace_bottom.png", "technic_electric_furnace_side.png",
	     "technic_electric_furnace_side.png", "technic_electric_furnace_side.png", "technic_electric_furnace_front.png"},
    paramtype2 = "facedir",
    groups = {cracky=2},
    legacy_facedir_simple = true,
    sounds = default.node_sound_stone_defaults(),
    on_construct = function(pos)
		      local meta = minetest.env:get_meta(pos)
		      meta:set_string("infotext", "Electric Furnace")
		      meta:set_float("technic_power_machine", 1)
		      meta:set_string("formspec", electric_furnace_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:electric_furnace_active",
   {description = "Electric Furnace",
    tiles = {"technic_electric_furnace_top.png", "technic_electric_furnace_bottom.png", "technic_electric_furnace_side.png",
	     "technic_electric_furnace_side.png", "technic_electric_furnace_side.png", "technic_electric_furnace_front_active.png"},
    paramtype2 = "facedir",
    light_source = 8,
    drop = "technic:electric_furnace",
    groups = {cracky=2, not_in_creative_inventory=1},
    legacy_facedir_simple = true,
    sounds = default.node_sound_stone_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:electric_furnace","technic:electric_furnace_active"},
     interval = 1,
     chance   = 1,
     action = function(pos, node, active_object_count, active_object_count_wider)
		 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         = "Electric furnace"
		 local machine_node         = "technic:electric_furnace"
		 local machine_state_demand = { 50, 1000 }
			 
		 -- 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
			    
		    -- Execute always if powered logic
		    local inv    = meta:get_inventory()
		    local empty  = inv:is_empty("src")

		    if state == 1 then
		       hacky_swap_node(pos, machine_node)
		       meta:set_string("infotext", machine_name.." Idle")

		       local result = minetest.get_craft_result({method = "cooking", width = 1, items = inv:get_list("src")})
		       if not empty and result and inv:room_for_item("dst",result) then
			  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") + 3) -- Cooking time 3x
			  local result = minetest.get_craft_result({method = "cooking", width = 1, items = inv:get_list("src")})
			  if result and result.item and meta:get_int("src_time") >= result.time then
			     -- check if there's room for output in "dst" list
			     meta:set_int("src_time", 0)
			     if inv:room_for_item("dst",result.item) then
				-- take stuff from "src" list
				srcstack = inv:get_stack("src", 1)
				srcstack:take_item()
				inv:set_stack("src", 1, srcstack)
				-- Put result in "dst" list
				inv:add_item("dst", result.item)
			     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:electric_furnace","RE")
technic.register_LV_machine ("technic:electric_furnace_active","RE")