biogasmachines: gas jet upgraded furnace added.
Jet Furnace that is 2 times faster than standard version in both item cooking time and Biogas consumption. Additionally it supports stack pulling from output tray (can be paired with High Perf Pusher) and longer auto-poweroff delay (to allow fuel to reach device before it automatically shuts down). Signed-off-by: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
This commit is contained in:
parent
2d7c24c7b7
commit
3e9996a6e2
@ -111,10 +111,14 @@ git clone https://github.com/realmicu/minetest-micupack.git micupack
|
|||||||
- device tries its best to fill output tray and can choose input items to effectively utilize
|
- device tries its best to fill output tray and can choose input items to effectively utilize
|
||||||
remaining space there
|
remaining space there
|
||||||
|
|
||||||
|
- **Biogas Jet Furnace**
|
||||||
|
|
||||||
|
Biogas Furnace that is 2 times faster than standard version in both item cooking time
|
||||||
|
and Biogas consumption. While functionally identical to its predecessor, it supports stack
|
||||||
|
pulling from output tray as well (can be paired with High Perf Pusher).
|
||||||
|
|
||||||
Planned:
|
Planned:
|
||||||
|
|
||||||
- Gas Jet Furnace - Gas Furnace that is 2 times faster than standard version in both item cooking
|
|
||||||
and Biogas consumption (but does not use more game resources at all; timer tick is still 1 sec)
|
|
||||||
- High Temperature Compressor - advanced machine to convert (albeit slowly) stone (or compressed
|
- High Temperature Compressor - advanced machine to convert (albeit slowly) stone (or compressed
|
||||||
gravel) to obsidian and coal block to diamonds; it will require water supplied either via buckets,
|
gravel) to obsidian and coal block to diamonds; it will require water supplied either via buckets,
|
||||||
through pipes (like freezer) or ice cubes(!) and a decent amount of Biogas
|
through pipes (like freezer) or ice cubes(!) and a decent amount of Biogas
|
||||||
|
11
TODO
11
TODO
@ -1,17 +1,16 @@
|
|||||||
|
|
||||||
slprogtools:
|
|
||||||
* consider custom naming of copier dongle the same way book gets titled
|
|
||||||
so device can be stored and treated as archive copies for software
|
|
||||||
|
|
||||||
biogasmachines:
|
biogasmachines:
|
||||||
* Gas Jet Furnace - Gas Furnace that is 2 times faster than standard version
|
|
||||||
in both item cooking and Biogas consumption
|
|
||||||
* High-Temp Compressor - heat up cobblestone or compressed gravel
|
* High-Temp Compressor - heat up cobblestone or compressed gravel
|
||||||
using Biogas and change it (slowly and with lot of energy) to obsidian;
|
using Biogas and change it (slowly and with lot of energy) to obsidian;
|
||||||
also compress coal block to diamond using the same technique; make other
|
also compress coal block to diamond using the same technique; make other
|
||||||
combinations possible through custom recipe registration; requires cooling
|
combinations possible through custom recipe registration; requires cooling
|
||||||
water - in buckets, via pipeworks or ice cubes
|
water - in buckets, via pipeworks or ice cubes
|
||||||
|
|
||||||
|
slprogtools:
|
||||||
|
* consider custom naming of copier dongle the same way book gets titled
|
||||||
|
so device can be stored and treated as archive copies for software
|
||||||
|
|
||||||
|
|
||||||
future plans:
|
future plans:
|
||||||
* Tubelib Chest Indicator - small attachable plate that indicates fill level
|
* Tubelib Chest Indicator - small attachable plate that indicates fill level
|
||||||
of connected Tubelib Chest
|
of connected Tubelib Chest
|
||||||
|
@ -21,4 +21,5 @@ dofile(minetest.get_modpath("biogasmachines").."/functions.lua")
|
|||||||
dofile(minetest.get_modpath("biogasmachines").."/freezer.lua")
|
dofile(minetest.get_modpath("biogasmachines").."/freezer.lua")
|
||||||
dofile(minetest.get_modpath("biogasmachines").."/gasifier.lua")
|
dofile(minetest.get_modpath("biogasmachines").."/gasifier.lua")
|
||||||
dofile(minetest.get_modpath("biogasmachines").."/gasfurnace.lua")
|
dofile(minetest.get_modpath("biogasmachines").."/gasfurnace.lua")
|
||||||
|
dofile(minetest.get_modpath("biogasmachines").."/jetfurnace.lua")
|
||||||
--dofile(minetest.get_modpath("biogasmachines").."/htcompressor.lua")
|
--dofile(minetest.get_modpath("biogasmachines").."/htcompressor.lua")
|
||||||
|
602
biogasmachines/jetfurnace.lua
Normal file
602
biogasmachines/jetfurnace.lua
Normal file
@ -0,0 +1,602 @@
|
|||||||
|
|
||||||
|
--[[
|
||||||
|
|
||||||
|
=======================================================================
|
||||||
|
Tubelib Biogas Machines Mod
|
||||||
|
by Micu (c) 2018
|
||||||
|
|
||||||
|
Copyright (C) 2018 Michal Cieslakiewicz
|
||||||
|
|
||||||
|
Biogas Jet Furnace is an upgraded version of standard Gas Furnace.
|
||||||
|
It works 2 times faster in both item cooking speed and Biogas
|
||||||
|
consumption. One unit of Biogas lasts for 20 seconds but items
|
||||||
|
are cooked twice as fast.
|
||||||
|
Please see gasfurnace.lua for differences between Biogas and Coal
|
||||||
|
furnaces as this device is functionally identical to Gas Furnace.
|
||||||
|
The only extra upgrade is support for pulling whole stacks from
|
||||||
|
output tray (like HighPerf Chest), so its output can be paired with
|
||||||
|
HighPerf Pusher.
|
||||||
|
|
||||||
|
Note about implementation: to maintain timer at 1 sec while halving
|
||||||
|
cooking time a random factor has been introduced for all cooking
|
||||||
|
durations that are odd numbers. Such items will cook either longer or
|
||||||
|
quicker with 50/50 probability. Example: from 10 iron lumps that have
|
||||||
|
standard cooking time 3 sec each, ~5 items should cook for 2 sec and
|
||||||
|
~5 for 1 sec giving average cooking time 1.5 sec and using proper
|
||||||
|
amount of Biogas.
|
||||||
|
|
||||||
|
License: LGPLv2.1+
|
||||||
|
=======================================================================
|
||||||
|
|
||||||
|
]]--
|
||||||
|
|
||||||
|
--[[
|
||||||
|
---------
|
||||||
|
Variables
|
||||||
|
---------
|
||||||
|
]]--
|
||||||
|
|
||||||
|
-- Jet Furnace uses Biogas twice as fast so 1 Biogas unit burns for 20 sec
|
||||||
|
local BIOGAS_BURN_TIME = 20
|
||||||
|
-- timing
|
||||||
|
local TIMER_TICK_SEC = 1 -- Node timer tick
|
||||||
|
local TICKS_TO_SLEEP = 5 -- Tubelib standby
|
||||||
|
-- machine inventory
|
||||||
|
local INV_H = 3 -- Inventory height
|
||||||
|
local INV_IN_W = 3 -- Input inventory width
|
||||||
|
local INV_OUT_W = (6 - INV_IN_W) -- Output inventory width
|
||||||
|
|
||||||
|
--[[
|
||||||
|
--------
|
||||||
|
Formspec
|
||||||
|
--------
|
||||||
|
]]--
|
||||||
|
-- static data for formspec
|
||||||
|
local fmxy = {
|
||||||
|
inv_h = tostring(INV_H),
|
||||||
|
inv_in_w = tostring(INV_IN_W),
|
||||||
|
mid_x = tostring(INV_IN_W + 1),
|
||||||
|
inv_out_w = tostring(INV_OUT_W),
|
||||||
|
inv_out_x = tostring(INV_IN_W + 2),
|
||||||
|
biogas_time = tostring(BIOGAS_BURN_TIME * TIMER_TICK_SEC)
|
||||||
|
}
|
||||||
|
|
||||||
|
-- Parameters:
|
||||||
|
-- state - tubelib state
|
||||||
|
-- fuel_percent - biogas used
|
||||||
|
-- item_percent - item completion
|
||||||
|
-- show_icons - show image hints (bool)
|
||||||
|
local function formspec(state, fuel_percent, item_percent, show_icons)
|
||||||
|
return "size[8,8.25]" ..
|
||||||
|
default.gui_bg ..
|
||||||
|
default.gui_bg_img ..
|
||||||
|
default.gui_slots ..
|
||||||
|
"list[context;src;0,0;" .. fmxy.inv_in_w .. "," .. fmxy.inv_h .. ";]" ..
|
||||||
|
"list[context;cur;" .. fmxy.inv_in_w .. ",0;1,1;]" ..
|
||||||
|
"image[" .. fmxy.inv_in_w ..
|
||||||
|
",1;1,1;biogasmachines_gasfurnace_inv_bg.png^[lowpart:" ..
|
||||||
|
tostring(fuel_percent) ..
|
||||||
|
":biogasmachines_gasfurnace_inv_fg.png]" ..
|
||||||
|
"image[" .. fmxy.mid_x .. ",1;1,1;gui_furnace_arrow_bg.png^[lowpart:" ..
|
||||||
|
tostring(item_percent) ..
|
||||||
|
":gui_furnace_arrow_fg.png^[transformR270]" ..
|
||||||
|
"list[context;fuel;" .. fmxy.inv_in_w .. ",2;1,1;]" ..
|
||||||
|
(show_icons and "item_image[" .. fmxy.inv_in_w ..
|
||||||
|
",2;1,1;tubelib_addons1:biogas]" or "") ..
|
||||||
|
"image_button[" .. fmxy.mid_x .. ",2;1,1;" ..
|
||||||
|
tubelib.state_button(state) .. ";button;]" ..
|
||||||
|
"item_image[2,3.25;0.5,0.5;biogasmachines:jetfurnace]" ..
|
||||||
|
"label[2.5,3.25;=]" ..
|
||||||
|
"item_image[2.75,3.25;0.5,0.5;default:furnace]" ..
|
||||||
|
"label[3.25,3.25;x 2]" ..
|
||||||
|
"item_image[4.5,3.25;0.5,0.5;tubelib_addons1:biogas]" ..
|
||||||
|
"label[5,3.25;= " .. fmxy.biogas_time .. " sec]" ..
|
||||||
|
"list[context;dst;" .. fmxy.inv_out_x .. ",0;" .. fmxy.inv_out_w ..
|
||||||
|
"," .. fmxy.inv_h .. ";]" ..
|
||||||
|
"list[current_player;main;0,4;8,1;]" ..
|
||||||
|
"list[current_player;main;0,5.25;8,3;8]" ..
|
||||||
|
"listring[context;dst]" ..
|
||||||
|
"listring[current_player;main]" ..
|
||||||
|
"listring[context;src]" ..
|
||||||
|
"listring[current_player;main]" ..
|
||||||
|
"listring[context;fuel]" ..
|
||||||
|
"listring[current_player;main]" ..
|
||||||
|
(state == tubelib.RUNNING and
|
||||||
|
"box[" .. fmxy.inv_in_w .. ",0;0.82,0.9;#BF5F2F]" or
|
||||||
|
"listring[context;cur]listring[current_player;main]") ..
|
||||||
|
default.get_hotbar_bg(0, 4)
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[
|
||||||
|
-------
|
||||||
|
Helpers
|
||||||
|
-------
|
||||||
|
]]--
|
||||||
|
|
||||||
|
local function jetfurnace_start(pos)
|
||||||
|
local node = minetest.get_node(pos)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
local number = meta:get_string("number")
|
||||||
|
local fuel = meta:get_int("fuel_ticks")
|
||||||
|
local label = minetest.registered_nodes[node.name].description
|
||||||
|
meta:set_int("item_ticks", -1)
|
||||||
|
meta:set_int("running", TICKS_TO_SLEEP)
|
||||||
|
meta:set_string("infotext", label .. " " .. number .. ": running")
|
||||||
|
meta:set_string("formspec", formspec(tubelib.RUNNING,
|
||||||
|
100 * fuel / BIOGAS_BURN_TIME, 0, true))
|
||||||
|
node.name = "biogasmachines:jetfurnace_active"
|
||||||
|
minetest.swap_node(pos, node)
|
||||||
|
minetest.get_node_timer(pos):start(TIMER_TICK_SEC)
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
local function jetfurnace_stop(pos)
|
||||||
|
local node = minetest.get_node(pos)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
local number = meta:get_string("number")
|
||||||
|
local fuel = meta:get_int("fuel_ticks")
|
||||||
|
local label = minetest.registered_nodes[node.name].description
|
||||||
|
meta:set_int("item_ticks", -1)
|
||||||
|
meta:set_int("running", tubelib.STATE_STOPPED)
|
||||||
|
meta:set_string("infotext", label .. " " .. number .. ": stopped")
|
||||||
|
meta:set_string("formspec", formspec(tubelib.STOPPED,
|
||||||
|
100 * fuel / BIOGAS_BURN_TIME, 0, true))
|
||||||
|
node.name = "biogasmachines:jetfurnace"
|
||||||
|
minetest.swap_node(pos, node)
|
||||||
|
minetest.get_node_timer(pos):stop()
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
local function jetfurnace_idle(pos)
|
||||||
|
local node = minetest.get_node(pos)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
local number = meta:get_string("number")
|
||||||
|
local fuel = meta:get_int("fuel_ticks")
|
||||||
|
local label = minetest.registered_nodes[node.name].description
|
||||||
|
meta:set_int("item_ticks", -1)
|
||||||
|
meta:set_int("running", tubelib.STATE_STANDBY)
|
||||||
|
meta:set_string("infotext", label .. " " .. number .. ": standby")
|
||||||
|
meta:set_string("formspec", formspec(tubelib.STANDBY,
|
||||||
|
100 * fuel / BIOGAS_BURN_TIME, 0, true))
|
||||||
|
node.name = "biogasmachines:jetfurnace"
|
||||||
|
minetest.swap_node(pos, node)
|
||||||
|
minetest.get_node_timer(pos):start(TIMER_TICK_SEC * TICKS_TO_SLEEP)
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
local function jetfurnace_fault(pos)
|
||||||
|
local node = minetest.get_node(pos)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
local number = meta:get_string("number")
|
||||||
|
local fuel = meta:get_int("fuel_ticks")
|
||||||
|
local label = minetest.registered_nodes[node.name].description
|
||||||
|
meta:set_int("item_ticks", -1)
|
||||||
|
meta:set_int("running", tubelib.STATE_FAULT)
|
||||||
|
meta:set_string("infotext", label .. " " .. number .. ": fault")
|
||||||
|
meta:set_string("formspec", formspec(tubelib.FAULT,
|
||||||
|
100 * fuel / BIOGAS_BURN_TIME, 0, true))
|
||||||
|
node.name = "biogasmachines:jetfurnace"
|
||||||
|
minetest.swap_node(pos, node)
|
||||||
|
minetest.get_node_timer(pos):stop()
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
local function countdown_to_idle_or_stop(pos, stop)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
local running = meta:get_int("running")
|
||||||
|
if running > 0 then
|
||||||
|
running = running - 1
|
||||||
|
meta:set_int("running", running)
|
||||||
|
if running == 0 then
|
||||||
|
if stop then
|
||||||
|
return jetfurnace_stop(pos)
|
||||||
|
else
|
||||||
|
return jetfurnace_idle(pos)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Wrapper for 'cooking' get_craft_result() function for specified ItemStack
|
||||||
|
-- Return values are as follows:
|
||||||
|
-- time - cooking time or 0 if not cookable
|
||||||
|
-- input - input itemstack (take it from source stack to get decremented input)
|
||||||
|
-- output - output itemstack array (all extra leftover products are also here)
|
||||||
|
-- decr_input - decremented input (without leftover products)
|
||||||
|
local function get_cooking_items(stack)
|
||||||
|
if stack:is_empty() then
|
||||||
|
return 0, nil, nil, nil
|
||||||
|
end
|
||||||
|
local cookout, decinp = minetest.get_craft_result({ method = "cooking",
|
||||||
|
width = 1, items = { stack } })
|
||||||
|
if cookout.time <= 0 or cookout.item:is_empty() then
|
||||||
|
return 0, nil, nil, nil
|
||||||
|
end
|
||||||
|
local inp = stack
|
||||||
|
local outp = { cookout.item }
|
||||||
|
local decp = decinp and decinp.items and decinp.items[1] or nil
|
||||||
|
if decp and not decp:is_empty() then
|
||||||
|
if decp:get_name() ~= stack:get_name() then
|
||||||
|
outp[#outp + 1] = decp
|
||||||
|
decp = ItemStack({})
|
||||||
|
else
|
||||||
|
inp = ItemStack(stack:get_name() .. " " ..
|
||||||
|
tostring(stack:get_count() - decp:get_count()))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return cookout.time, inp, outp, decp
|
||||||
|
end
|
||||||
|
|
||||||
|
-- calculates fast (jet) cooking time, adding randomly 1's and 0's
|
||||||
|
-- to odd durations to compensate halves
|
||||||
|
local function get_fast_cooking_time(time)
|
||||||
|
local otime = math.max(math.floor(time + 0.5), 2) -- rounding
|
||||||
|
local ntime = math.floor(otime / 2)
|
||||||
|
if otime % 2 == 0 then
|
||||||
|
return ntime
|
||||||
|
else
|
||||||
|
return math.random(ntime, ntime + 1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[
|
||||||
|
---------
|
||||||
|
Callbacks
|
||||||
|
---------
|
||||||
|
]]--
|
||||||
|
|
||||||
|
-- do not allow to dig non-empty machine
|
||||||
|
local function can_dig(pos, player)
|
||||||
|
local meta = minetest.get_meta(pos);
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
return inv:is_empty("src") and inv:is_empty("dst")
|
||||||
|
and inv:is_empty("fuel")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- cleanup after digging
|
||||||
|
local function after_dig_node(pos, oldnode, oldmetadata, digger)
|
||||||
|
tubelib.remove_node(pos)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- validate incoming items
|
||||||
|
local function allow_metadata_inventory_put(pos, listname, index, stack, player)
|
||||||
|
if minetest.is_protected(pos, player:get_player_name()) then
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
if listname == "src" then
|
||||||
|
if stack:get_name() == "tubelib_addons1:biogas" then
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
return stack:get_count()
|
||||||
|
end
|
||||||
|
elseif listname == "cur" or listname == "dst" then
|
||||||
|
return 0
|
||||||
|
elseif listname == "fuel" then
|
||||||
|
if stack:get_name() == "tubelib_addons1:biogas" then
|
||||||
|
return stack:get_count()
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
|
||||||
|
-- validate items move
|
||||||
|
local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
if to_list == "cur" or
|
||||||
|
(from_list == "cur" and meta:get_int("running") > 0) then
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
local stack = inv:get_stack(from_list, from_index)
|
||||||
|
return allow_metadata_inventory_put(pos, to_list, to_index, stack, player)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- validate items retrieval
|
||||||
|
local function allow_metadata_inventory_take(pos, listname, index, stack, player)
|
||||||
|
if minetest.is_protected(pos, player:get_player_name()) then
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
if listname == "cur" then
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
if meta:get_int("running") > 0 then
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return stack:get_count()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- punch machine to see status info
|
||||||
|
local function on_punch(pos, node, puncher, pointed_thing)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
local player_name = puncher:get_player_name()
|
||||||
|
if meta:get_string("owner") ~= player_name then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
local msgclr = { ["fault"] = "#FFBFBF",
|
||||||
|
["standby"] = "#BFFFFF",
|
||||||
|
["stopped"] = "#BFBFFF",
|
||||||
|
["running"] = "#BFFFBF"
|
||||||
|
}
|
||||||
|
local state = tubelib.statestring(meta:get_int("running"))
|
||||||
|
local pipe = tostring(biogasmachines.is_pipe_with_water(pos, node))
|
||||||
|
minetest.chat_send_player(player_name,
|
||||||
|
minetest.colorize("#FFFF00", "[BiogasJetFurnace:" ..
|
||||||
|
meta:get_string("number") .. "]") .. " Status is " ..
|
||||||
|
minetest.colorize(msgclr[state], "\"" .. state .. "\""))
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
-- formspec callback
|
||||||
|
local function on_receive_fields(pos, formname, fields, player)
|
||||||
|
if minetest.is_protected(pos, player:get_player_name()) then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
local running = meta:get_int("running")
|
||||||
|
if fields and fields.button then
|
||||||
|
if running > 0 or running == tubelib.STATE_FAULT then
|
||||||
|
jetfurnace_stop(pos)
|
||||||
|
else
|
||||||
|
jetfurnace_start(pos)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- tick-based item production
|
||||||
|
local function on_timer(pos, elapsed)
|
||||||
|
local node = minetest.get_node(pos)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
local label = minetest.registered_nodes[node.name].description
|
||||||
|
local number = meta:get_string("number")
|
||||||
|
local running = meta:get_int("running")
|
||||||
|
local itemcnt = meta:get_int("item_ticks")
|
||||||
|
local fuel = meta:get_int("fuel_ticks")
|
||||||
|
if fuel == 0 and inv:is_empty("fuel") then
|
||||||
|
-- no fuel - no work (but wait a little)
|
||||||
|
return countdown_to_idle_or_stop(pos, true)
|
||||||
|
end
|
||||||
|
local recipe = {}
|
||||||
|
local inp
|
||||||
|
if inv:is_empty("cur") then
|
||||||
|
-- idle and ready, check for something to work with
|
||||||
|
if inv:is_empty("src") then
|
||||||
|
return countdown_to_idle_or_stop(pos)
|
||||||
|
end
|
||||||
|
-- find item to cook/smelt that fits output tray
|
||||||
|
-- (parse list items as first choice is not always the best one)
|
||||||
|
local idx = -2
|
||||||
|
for i = 1, inv:get_size("src") do
|
||||||
|
inp = inv:get_stack("src", i)
|
||||||
|
if not inp:is_empty() then
|
||||||
|
recipe.time, recipe.input, recipe.output,
|
||||||
|
recipe.decremented_input = get_cooking_items(inp)
|
||||||
|
if recipe.time > 0 then
|
||||||
|
idx = -1
|
||||||
|
if inv:room_for_item("dst", recipe.output[1]) and
|
||||||
|
(not recipe.output[2] or
|
||||||
|
inv:room_for_item("dst", recipe.output[2])) then
|
||||||
|
idx = i
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- (idx == -2 - nothing cookable found in src)
|
||||||
|
-- (idx == -1 - cookable item in src but no space in dst)
|
||||||
|
if idx < 0 then
|
||||||
|
if idx < -1 then
|
||||||
|
return countdown_to_idle_or_stop(pos)
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
if meta:get_int("running") == tubelib.STATE_STANDBY then
|
||||||
|
-- something to do, wake up and re-entry
|
||||||
|
return jetfurnace_start(pos)
|
||||||
|
end
|
||||||
|
recipe.time = get_fast_cooking_time(recipe.time)
|
||||||
|
inv:set_stack("src", idx, recipe.decremented_input)
|
||||||
|
inv:set_stack("cur", 1, recipe.input)
|
||||||
|
meta:set_int("item_ticks", recipe.time)
|
||||||
|
meta:set_int("item_total", recipe.time)
|
||||||
|
itemcnt = recipe.time
|
||||||
|
else
|
||||||
|
-- production tick
|
||||||
|
inp = inv:get_stack("cur", 1)
|
||||||
|
if inp:is_empty() then
|
||||||
|
return jetfurnace_fault(pos) -- oops
|
||||||
|
end
|
||||||
|
recipe.time = meta:get_int("item_total")
|
||||||
|
if itemcnt < 0 then
|
||||||
|
itemcnt = recipe.time -- cook again
|
||||||
|
end
|
||||||
|
itemcnt = itemcnt - 1
|
||||||
|
if itemcnt == 0 then
|
||||||
|
local zzz
|
||||||
|
zzz, zzz, recipe.output = get_cooking_items(inp)
|
||||||
|
for _, i in ipairs(recipe.output) do
|
||||||
|
inv:add_item("dst", i)
|
||||||
|
end
|
||||||
|
inv:set_stack("cur", 1, ItemStack({}))
|
||||||
|
itemcnt = -1
|
||||||
|
recipe.time = -1
|
||||||
|
end
|
||||||
|
meta:set_int("item_ticks", itemcnt)
|
||||||
|
-- consume fuel tick
|
||||||
|
if fuel == 0 then
|
||||||
|
if not inv:is_empty("fuel") then
|
||||||
|
inv:remove_item("fuel",
|
||||||
|
ItemStack("tubelib_addons1:biogas 1"))
|
||||||
|
fuel = BIOGAS_BURN_TIME
|
||||||
|
else
|
||||||
|
-- oops
|
||||||
|
return jetfurnace_fault(pos)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
fuel = fuel - 1
|
||||||
|
meta:set_int("fuel_ticks", fuel)
|
||||||
|
end
|
||||||
|
meta:set_int("running", TICKS_TO_SLEEP)
|
||||||
|
meta:set_string("infotext", label .. " " .. number .. ": running")
|
||||||
|
meta:set_string("formspec", formspec(tubelib.RUNNING,
|
||||||
|
100 * fuel / BIOGAS_BURN_TIME,
|
||||||
|
100 * (recipe.time - itemcnt) / recipe.time, true))
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[
|
||||||
|
-----------------
|
||||||
|
Node registration
|
||||||
|
-----------------
|
||||||
|
]]--
|
||||||
|
|
||||||
|
minetest.register_node("biogasmachines:jetfurnace", {
|
||||||
|
description = "Tubelib Biogas Jet Furnace",
|
||||||
|
tiles = {
|
||||||
|
-- up, down, right, left, back, front
|
||||||
|
"biogasmachines_jetfurnace_top.png",
|
||||||
|
"biogasmachines_bottom.png",
|
||||||
|
"biogasmachines_jetfurnace_side.png",
|
||||||
|
"biogasmachines_jetfurnace_side.png",
|
||||||
|
"biogasmachines_jetfurnace_side.png",
|
||||||
|
"biogasmachines_jetfurnace_side.png",
|
||||||
|
},
|
||||||
|
drawtype = "nodebox",
|
||||||
|
|
||||||
|
paramtype = "light",
|
||||||
|
sunlight_propagates = true,
|
||||||
|
paramtype2 = "facedir",
|
||||||
|
groups = { choppy = 2, cracky = 2, crumbly = 2 },
|
||||||
|
is_ground_content = false,
|
||||||
|
sounds = default.node_sound_metal_defaults(),
|
||||||
|
|
||||||
|
can_dig = can_dig,
|
||||||
|
after_dig_node = after_dig_node,
|
||||||
|
on_punch = on_punch,
|
||||||
|
on_rotate = screwdriver.disallow,
|
||||||
|
on_timer = on_timer,
|
||||||
|
on_receive_fields = on_receive_fields,
|
||||||
|
allow_metadata_inventory_put = allow_metadata_inventory_put,
|
||||||
|
allow_metadata_inventory_move = allow_metadata_inventory_move,
|
||||||
|
allow_metadata_inventory_take = allow_metadata_inventory_take,
|
||||||
|
|
||||||
|
after_place_node = function(pos, placer, itemstack, pointed_thing)
|
||||||
|
local node = minetest.get_node(pos)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
local number = tubelib.add_node(pos, "biogasmachines:jetfurnace")
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
inv:set_size('src', INV_H * INV_IN_W)
|
||||||
|
inv:set_size('cur', 1)
|
||||||
|
inv:set_size('fuel', 1)
|
||||||
|
inv:set_size('dst', INV_H * INV_OUT_W)
|
||||||
|
local label = minetest.registered_nodes[node.name].description
|
||||||
|
meta:set_string("number", number)
|
||||||
|
meta:set_string("owner", placer:get_player_name())
|
||||||
|
meta:set_int("running", tubelib.STATE_STOPPED)
|
||||||
|
meta:set_int("fuel_ticks", 0)
|
||||||
|
meta:set_int("item_ticks", -1)
|
||||||
|
meta:set_int("item_total", 0)
|
||||||
|
meta:set_string("infotext", label .. " " .. number .. ": stopped")
|
||||||
|
meta:set_string("formspec", formspec(tubelib.STOPPED, 0, 0, true))
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_node("biogasmachines:jetfurnace_active", {
|
||||||
|
description = "Tubelib Biogas Jet Furnace",
|
||||||
|
tiles = {
|
||||||
|
-- up, down, right, left, back, front
|
||||||
|
{
|
||||||
|
image = "biogasmachines_jetfurnace_active_top.png",
|
||||||
|
backface_culling = false,
|
||||||
|
animation = {
|
||||||
|
type = "vertical_frames",
|
||||||
|
aspect_w = 32,
|
||||||
|
aspect_h = 32,
|
||||||
|
length = 1.5,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"biogasmachines_bottom.png",
|
||||||
|
"biogasmachines_jetfurnace_side.png",
|
||||||
|
"biogasmachines_jetfurnace_side.png",
|
||||||
|
"biogasmachines_jetfurnace_side.png",
|
||||||
|
"biogasmachines_jetfurnace_side.png",
|
||||||
|
},
|
||||||
|
drawtype = "nodebox",
|
||||||
|
|
||||||
|
paramtype = "light",
|
||||||
|
sunlight_propagates = true,
|
||||||
|
paramtype2 = "facedir",
|
||||||
|
groups = { crumbly = 0, not_in_creative_inventory = 1 },
|
||||||
|
is_ground_content = false,
|
||||||
|
light_source = 6,
|
||||||
|
sounds = default.node_sound_metal_defaults(),
|
||||||
|
|
||||||
|
can_dig = can_dig,
|
||||||
|
after_dig_node = after_dig_node,
|
||||||
|
on_punch = on_punch,
|
||||||
|
on_rotate = screwdriver.disallow,
|
||||||
|
on_timer = on_timer,
|
||||||
|
on_receive_fields = on_receive_fields,
|
||||||
|
allow_metadata_inventory_put = allow_metadata_inventory_put,
|
||||||
|
allow_metadata_inventory_move = allow_metadata_inventory_move,
|
||||||
|
allow_metadata_inventory_take = allow_metadata_inventory_take,
|
||||||
|
drop = "biogasmachines:jetfurnace",
|
||||||
|
})
|
||||||
|
tubelib.register_node("biogasmachines:jetfurnace", { "biogasmachines:jetfurnace_active" }, {
|
||||||
|
|
||||||
|
on_push_item = function(pos, side, item)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
if item:get_name() == "tubelib_addons1:biogas" then
|
||||||
|
return tubelib.put_item(meta, "fuel", item)
|
||||||
|
end
|
||||||
|
return tubelib.put_item(meta, "src", item)
|
||||||
|
end,
|
||||||
|
|
||||||
|
on_pull_item = function(pos, side)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
return tubelib.get_item(meta, "dst")
|
||||||
|
end,
|
||||||
|
|
||||||
|
on_pull_stack = function(pos, side)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
return tubelib.get_stack(meta, "dst")
|
||||||
|
end,
|
||||||
|
|
||||||
|
on_unpull_item = function(pos, side, item)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
return tubelib.put_item(meta, "dst", item)
|
||||||
|
end,
|
||||||
|
|
||||||
|
on_recv_message = function(pos, topic, payload)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
if topic == "on" then
|
||||||
|
jetfurnace_start(pos)
|
||||||
|
elseif topic == "off" then
|
||||||
|
jetfurnace_stop(pos)
|
||||||
|
elseif topic == "state" then
|
||||||
|
return tubelib.statestring(meta:get_int("running"))
|
||||||
|
elseif topic == "fuel" then
|
||||||
|
return tubelib.fuelstate(meta, "fuel")
|
||||||
|
else
|
||||||
|
return "unsupported"
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
--[[
|
||||||
|
--------
|
||||||
|
Crafting
|
||||||
|
--------
|
||||||
|
]]--
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "biogasmachines:jetfurnace",
|
||||||
|
recipe = {
|
||||||
|
{ "default:obsidian_block", "biogasmachines:gasfurnace", "" },
|
||||||
|
{ "biogasmachines:gasfurnace", "default:goldblock", "" },
|
||||||
|
{ "", "", "" },
|
||||||
|
},
|
||||||
|
})
|
Binary file not shown.
Before Width: | Height: | Size: 128 KiB After Width: | Height: | Size: 180 KiB |
BIN
biogasmachines/textures/biogasmachines_jetfurnace_active_top.png
Normal file
BIN
biogasmachines/textures/biogasmachines_jetfurnace_active_top.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.9 KiB |
BIN
biogasmachines/textures/biogasmachines_jetfurnace_side.png
Normal file
BIN
biogasmachines/textures/biogasmachines_jetfurnace_side.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
BIN
biogasmachines/textures/biogasmachines_jetfurnace_top.png
Normal file
BIN
biogasmachines/textures/biogasmachines_jetfurnace_top.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.4 KiB |
Loading…
x
Reference in New Issue
Block a user