biogasmachines: compactor machine added.
Compactor machine compresses material using Biogas as fuel and Ice cubes as coolant. Recipes are added using public API function. Signed-off-by: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
This commit is contained in:
parent
64f469f4c4
commit
e72ffe28ad
12
README.md
12
README.md
@ -117,8 +117,14 @@ git clone https://github.com/realmicu/minetest-micupack.git micupack
|
||||
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).
|
||||
|
||||
- **Compactor**
|
||||
|
||||
Heavy press with heating, compacting and cooling functions that can compress stone-like
|
||||
resources into very dense and hard materials, like obsidian. Default recipes include
|
||||
converting cobble and compressed gravel to obsidian, flint to obsidian shards and coal
|
||||
blocks to diamonds. Machine consumes Biogas for heating/compacting and Ice for rapid cooling.
|
||||
Custom recipes can be added via API function.
|
||||
|
||||
Planned:
|
||||
|
||||
- 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,
|
||||
through pipes (like freezer) or ice cubes(!) and a decent amount of Biogas
|
||||
- Biogas Torch - Biogas-powered replacement for standard torch (source of light)
|
||||
|
13
TODO
13
TODO
@ -1,13 +1,12 @@
|
||||
|
||||
biogasmachines:
|
||||
* High-Temp Compressor - heat up cobblestone or compressed gravel
|
||||
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
|
||||
combinations possible through custom recipe registration; requires cooling
|
||||
water - in buckets, via pipeworks or ice cubes
|
||||
|
||||
* Gasifier - move unified_inventory recipe registration to
|
||||
add_gasifier_recipe() function (like Compactor)
|
||||
|
||||
future plans:
|
||||
* Biogas Torch - crafted from glass, biogas and steel ingot (that gives 8)
|
||||
replacement for default coal torch; should use the same model and mechanics
|
||||
but modified textures (metal box, blueish light)
|
||||
* Tubelib Chest Indicator - small attachable plate that indicates fill level
|
||||
of connected Tubelib Chest
|
||||
* Metal Recycler - decomposing device to retrieve metal ingots, Mese shardsxi
|
||||
@ -16,6 +15,4 @@ future plans:
|
||||
quantity; Mese crystals will be converted to shards for calculation purposes;
|
||||
fuelled by moderate volume of Biogas; robust recipe parser is required for
|
||||
this device
|
||||
* Portable Biogas Torch (optional, TBD) - a tool to melt down ice and produce
|
||||
water source from it
|
||||
|
||||
|
790
biogasmachines/compactor.lua
Normal file
790
biogasmachines/compactor.lua
Normal file
@ -0,0 +1,790 @@
|
||||
--[[
|
||||
|
||||
=======================================================================
|
||||
Tubelib Biogas Machines Mod
|
||||
by Micu (c) 2018
|
||||
|
||||
Copyright (C) 2018 Michal Cieslakiewicz
|
||||
|
||||
Compactor is a heavy mechanical press with heating, compacting and
|
||||
cooling systems combined into one device. It compresses stone-like
|
||||
resources into very dense and hard materials, mainly obsidian. Default
|
||||
recipes include converting cobble and compressed gravel to obsidian,
|
||||
flint to obsidian shards and coal blocks to diamonds. Machine consumes
|
||||
Biogas for heating/compacting and Ice for rapid cooling.
|
||||
More custom recipes can be added via API function.
|
||||
|
||||
Operational info:
|
||||
* machine requires Biogas as fuel (one unit lasts for 12 seconds) and
|
||||
Ice for cooling (one ice cube per source item)
|
||||
* if there is nothing to process or there is no ice, machine enters
|
||||
standby mode; it will automatically pick up work as soon as any valid
|
||||
item is loaded into input (source) tray and ice is available
|
||||
* there is 1 tick gap between processing items to perform machinery
|
||||
cleaning and reload working trays; this is a design choice
|
||||
* working trays can only be emptied when machine is stopped; these trays
|
||||
are auto-loaded, source material should always go into input container
|
||||
and ice into slot next to button
|
||||
* machine cannot be recovered unless input, output, fuel and ice trays
|
||||
are all empty
|
||||
* powering off device during compacting cancels the process; Biogas used
|
||||
to power the machine is not recoverable; operation starts from
|
||||
beginning when device is powered on again
|
||||
* device always checks if expected products will fit output tray so
|
||||
some input items may be omitted temporarily
|
||||
|
||||
License: LGPLv2.1+
|
||||
=======================================================================
|
||||
|
||||
]]--
|
||||
|
||||
--[[
|
||||
---------
|
||||
Variables
|
||||
---------
|
||||
]]--
|
||||
|
||||
-- Biogas time in ticks
|
||||
local BIOGAS_WORK_TIME = 12
|
||||
-- timing
|
||||
local TIMER_TICK_SEC = 1 -- Node timer tick
|
||||
local TICKS_TO_SLEEP = 5 -- Tubelib standby
|
||||
-- machine inventory
|
||||
local INV_H = 3 -- Inventory height (do not change)
|
||||
local INV_IN_W = 3 -- Input inventory width
|
||||
local INV_OUT_W = (5 - INV_IN_W) -- Output inventory width
|
||||
|
||||
-- machine recipe table (key - source item name)
|
||||
local compactor_recipes = {}
|
||||
-- hintbar recipe index table (indexed by numbers for formspec recipe hint bar)
|
||||
local hintbar_recipes = {}
|
||||
|
||||
--[[
|
||||
----------------
|
||||
Public functions
|
||||
----------------
|
||||
]]--
|
||||
|
||||
-- Add Compactor recipe
|
||||
-- Returns true if recipe added successfully, false if error or already present
|
||||
-- recipe = {
|
||||
-- input = "itemstring", -- source items (req)
|
||||
-- output = "itemstring", -- product items (req)
|
||||
-- time = number -- production time in ticks (req, max: 99)
|
||||
-- }
|
||||
function biogasmachines.add_compactor_recipe(recipe)
|
||||
if not recipe then return false end
|
||||
if not recipe.input or not recipe.output or not recipe.time or
|
||||
recipe.time < 1 or recipe.time > 99 then
|
||||
return false
|
||||
end
|
||||
local input_item = ItemStack(recipe.input)
|
||||
local output_item = ItemStack(recipe.output)
|
||||
if not input_item or not input_item:is_known() or
|
||||
not output_item or not output_item:is_known() then
|
||||
return false
|
||||
end
|
||||
local input_name = input_item:get_name()
|
||||
if compactor_recipes[input_name] then return false end
|
||||
compactor_recipes[input_name] = {
|
||||
input = input_item, -- (duplicated for faster access)
|
||||
output = output_item,
|
||||
time = recipe.time
|
||||
}
|
||||
hintbar_recipes[#hintbar_recipes + 1] = input_name
|
||||
if minetest.get_modpath("unified_inventory") and unified_inventory then
|
||||
unified_inventory.register_craft({
|
||||
type = "compactor",
|
||||
items = { input_item:to_string() },
|
||||
output = output_item:to_string(),
|
||||
})
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
|
||||
--[[
|
||||
--------
|
||||
Formspec
|
||||
--------
|
||||
]]--
|
||||
|
||||
-- static data for formspec
|
||||
local fmxy = {
|
||||
inv_h = tostring(INV_H),
|
||||
inv_in_w = tostring(INV_IN_W), -- (also 1st col of mid panel)
|
||||
mid_x05 = tostring(INV_IN_W + 0.5),
|
||||
mid_x1 = tostring(INV_IN_W + 1), -- (2nd col of mid panel)
|
||||
mid_x15 = tostring(INV_IN_W + 1.5),
|
||||
mid_x2 = tostring(INV_IN_W + 2), -- (3rd col of mid panel)
|
||||
inv_out_x = tostring(INV_IN_W + 3), -- (1st col of dst inv)
|
||||
inv_out_w = tostring(INV_OUT_W),
|
||||
biogas_time = tostring(BIOGAS_WORK_TIME * TIMER_TICK_SEC),
|
||||
}
|
||||
|
||||
-- recipe hint
|
||||
local function formspec_recipe_hint_bar(recipe_idx, show_icons)
|
||||
if #hintbar_recipes == 0 or recipe_idx > #hintbar_recipes then
|
||||
return ""
|
||||
end
|
||||
local input_name = hintbar_recipes[recipe_idx]
|
||||
local recipe = compactor_recipes[input_name]
|
||||
local output_name = recipe.output:get_name()
|
||||
local input_count = tostring(recipe.input:get_count())
|
||||
local output_count = tostring(recipe.output:get_count())
|
||||
--local input_desc = minetest.registered_nodes[input_name].description
|
||||
--local output_desc = minetest.registered_nodes[output_name].description
|
||||
return (show_icons and "item_image[0,0;1,1;" .. input_name .. "]" ..
|
||||
"item_image[" .. fmxy.inv_out_x .. ",0;1,1;" .. output_name ..
|
||||
"]" or "") ..
|
||||
"label[0,3.25;Recipe]" ..
|
||||
"image_button[0.8,3.3;0.5,0.5;;left;<]" ..
|
||||
"label[1.2,3.25;" ..
|
||||
string.format("%2d / %2d", recipe_idx, #hintbar_recipes) ..
|
||||
"]" ..
|
||||
"image_button[1.9,3.3;0.5,0.5;;right;>]" ..
|
||||
"item_image[2.4,3.25;0.5,0.5;" .. input_name .. "]" ..
|
||||
"label[2.9,3.25;x " .. input_count .. "]" ..
|
||||
"image[3.3,3.25;0.5,0.5;tubelib_gui_arrow.png^[resize:16x16]" ..
|
||||
"label[3.7,3.25;" ..
|
||||
string.format("%2d sec +", recipe.time * TIMER_TICK_SEC) .. "]" ..
|
||||
"item_image[4.5,3.25;0.5,0.5;default:ice]" ..
|
||||
"image[4.9,3.25;0.5,0.5;tubelib_gui_arrow.png^[resize:16x16]" ..
|
||||
"item_image[5.3,3.25;0.5,0.5;" .. output_name .. "]" ..
|
||||
"label[5.8,3.25;x " .. output_count .. "]" ..
|
||||
"item_image[6.5,3.25;0.5,0.5;tubelib_addons1:biogas]" ..
|
||||
"label[7,3.25;= " .. fmxy.biogas_time .. " sec]"
|
||||
end
|
||||
|
||||
-- Parameters:
|
||||
-- state - tubelib state
|
||||
-- fuel_percent - biogas used
|
||||
-- item_percent - item completion
|
||||
-- recipe_idx - index of recipe shown at hint bar
|
||||
-- show_icons - show image hints (bool)
|
||||
local function formspec(state, fuel_percent, item_percent,
|
||||
recipe_idx, 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.mid_x05 .. ",0;1,1;]" ..
|
||||
"list[context;cic;" .. fmxy.mid_x15 .. ",0;1,1;]" ..
|
||||
"image[" .. fmxy.mid_x05 ..
|
||||
",1;1,1;biogasmachines_compactor_inv_bg.png^[lowpart:" ..
|
||||
tostring(fuel_percent) ..
|
||||
":biogasmachines_compactor_inv_fg.png]" ..
|
||||
"image[" .. fmxy.mid_x15 ..
|
||||
",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;]" ..
|
||||
"list[context;ice;" .. fmxy.mid_x2 .. ",2;1,1;]" ..
|
||||
(show_icons and "item_image[" .. fmxy.inv_in_w ..
|
||||
",2;1,1;tubelib_addons1:biogas]" ..
|
||||
"item_image[" .. fmxy.mid_x2 .. ",2;1,1;default:ice]" or "") ..
|
||||
"image_button[" .. fmxy.mid_x1 .. ",2;1,1;" ..
|
||||
tubelib.state_button(state) .. ";button;]" ..
|
||||
formspec_recipe_hint_bar(recipe_idx, show_icons) ..
|
||||
"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]" ..
|
||||
"listring[context;ice]" ..
|
||||
"listring[current_player;main]" ..
|
||||
(state == tubelib.RUNNING and
|
||||
"box[" .. fmxy.mid_x05 .. ",0;0.82,0.9;#BF5F2F]" ..
|
||||
"box[" .. fmxy.mid_x15 .. ",0;0.82,0.9;#2F4FBF]"
|
||||
or "listring[context;cur]listring[current_player;main]" ..
|
||||
"listring[context;cic]listring[current_player;main]") ..
|
||||
default.get_hotbar_bg(0, 4)
|
||||
end
|
||||
|
||||
--[[
|
||||
-------
|
||||
Helpers
|
||||
-------
|
||||
]]--
|
||||
|
||||
local function compactor_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 recipe_idx = meta:get_int("recipe_idx")
|
||||
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_WORK_TIME, 0, recipe_idx, true))
|
||||
node.name = "biogasmachines:compactor_active"
|
||||
minetest.swap_node(pos, node)
|
||||
minetest.get_node_timer(pos):start(TIMER_TICK_SEC)
|
||||
return false
|
||||
end
|
||||
|
||||
local function compactor_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 recipe_idx = meta:get_int("recipe_idx")
|
||||
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_WORK_TIME, 0, recipe_idx, true))
|
||||
node.name = "biogasmachines:compactor"
|
||||
minetest.swap_node(pos, node)
|
||||
minetest.get_node_timer(pos):stop()
|
||||
return false
|
||||
end
|
||||
|
||||
local function compactor_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 recipe_idx = meta:get_int("recipe_idx")
|
||||
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_WORK_TIME, 0, recipe_idx, true))
|
||||
node.name = "biogasmachines:compactor"
|
||||
minetest.swap_node(pos, node)
|
||||
minetest.get_node_timer(pos):start(TIMER_TICK_SEC * TICKS_TO_SLEEP)
|
||||
return false
|
||||
end
|
||||
|
||||
local function compactor_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 recipe_idx = meta:get_int("recipe_idx")
|
||||
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_WORK_TIME, 0, recipe_idx, true))
|
||||
node.name = "biogasmachines:compactor"
|
||||
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 compactor_stop(pos)
|
||||
else
|
||||
return compactor_idle(pos)
|
||||
end
|
||||
end
|
||||
end
|
||||
return true
|
||||
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") and inv:is_empty("ice")
|
||||
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
|
||||
local item_name = stack:get_name()
|
||||
if listname == "src" then
|
||||
if compactor_recipes[item_name] then
|
||||
return stack:get_count()
|
||||
else
|
||||
return 0
|
||||
end
|
||||
elseif listname == "cur" or listname == "cic" or listname == "dst" then
|
||||
return 0
|
||||
elseif listname == "fuel" then
|
||||
if item_name == "tubelib_addons1:biogas" then
|
||||
return stack:get_count()
|
||||
else
|
||||
return 0
|
||||
end
|
||||
elseif listname == "ice" then
|
||||
if item_name == "default:ice" 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 to_list == "cic" or
|
||||
((from_list == "cur" or from_list == "cic") 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" or listname == "cic" 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"))
|
||||
minetest.chat_send_player(player_name,
|
||||
minetest.colorize("#FFFF00", "[Compactor:" ..
|
||||
meta:get_string("number") .. "]") .. " Status is " ..
|
||||
minetest.colorize(msgclr[state], "\"" .. state .. "\""))
|
||||
return true
|
||||
end
|
||||
|
||||
-- formspec button handler
|
||||
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
|
||||
compactor_stop(pos)
|
||||
else
|
||||
compactor_start(pos)
|
||||
end
|
||||
end
|
||||
if fields and (fields.left or fields.right) then
|
||||
-- update hintbar
|
||||
local fuel = meta:get_int("fuel_ticks")
|
||||
local item_ticks = meta:get_int("item_ticks")
|
||||
local recipe_idx = meta:get_int("recipe_idx")
|
||||
if fields.left then
|
||||
recipe_idx = math.max(recipe_idx - 1, 1)
|
||||
end
|
||||
if fields.right then
|
||||
recipe_idx = math.min(recipe_idx + 1, #hintbar_recipes)
|
||||
end
|
||||
local item_pct = 0
|
||||
if item_ticks >= 0 then
|
||||
local item_time = meta:get_int("item_total")
|
||||
item_pct = 100 * (item_time - item_ticks) / item_time
|
||||
end
|
||||
meta:set_int("recipe_idx", recipe_idx)
|
||||
meta:set_string("formspec", formspec(tubelib.state(running),
|
||||
100 * fuel / BIOGAS_WORK_TIME, item_pct, recipe_idx,
|
||||
true))
|
||||
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")
|
||||
local recipe_idx = meta:get_int("recipe_idx")
|
||||
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 prodtime = -1
|
||||
local ice = ItemStack("default:ice 1")
|
||||
if inv:is_empty("cur") then
|
||||
-- idle and ready, check for something to work with
|
||||
if inv:is_empty("src") or inv:is_empty("ice") then
|
||||
return countdown_to_idle_or_stop(pos)
|
||||
end
|
||||
-- find item to compact that fits output tray
|
||||
local is_src_ok = false
|
||||
local src_copy = inv:set_list("src_copy", inv:get_list("src"))
|
||||
for _, r in pairs(compactor_recipes) do
|
||||
local s = inv:remove_item("src_copy", r.input)
|
||||
if s:get_count() == r.input:get_count() then
|
||||
is_src_ok = true
|
||||
if inv:room_for_item("dst", r.output) then
|
||||
recipe = r
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
inv:set_size("src_copy", 0)
|
||||
if not recipe.time then
|
||||
if is_src_ok then
|
||||
return true -- busy wait for space in dst
|
||||
else
|
||||
return countdown_to_idle_or_stop(pos)
|
||||
end
|
||||
elseif running == tubelib.STATE_STANDBY then
|
||||
-- something to do, wake up and re-entry
|
||||
return compactor_start(pos)
|
||||
end
|
||||
local s = inv:remove_item("src", recipe.input)
|
||||
if s:is_empty() or s:get_count() < recipe.input:get_count() then
|
||||
return compactor_fault(pos) -- oops
|
||||
end
|
||||
inv:set_stack("cur", 1, recipe.input)
|
||||
if inv:is_empty("cic") then
|
||||
s = inv:remove_item("ice", ice)
|
||||
if s:is_empty() then
|
||||
return compactor_fault(pos) -- oops
|
||||
end
|
||||
inv:set_stack("cic", 1, s)
|
||||
end
|
||||
meta:set_int("item_ticks", recipe.time)
|
||||
meta:set_int("item_total", recipe.time)
|
||||
itemcnt = recipe.time
|
||||
prodtime = recipe.time
|
||||
else
|
||||
-- production tick
|
||||
if inv:is_empty("cic") then
|
||||
if inv:is_empty("ice") then
|
||||
return countdown_to_idle_or_stop(pos)
|
||||
end
|
||||
local s = inv:remove_item("ice", ice)
|
||||
if s:is_empty() then
|
||||
return compactor_fault(pos) -- oops
|
||||
end
|
||||
inv:set_stack("cic", 1, s)
|
||||
end
|
||||
local s = inv:get_stack("cur", 1)
|
||||
if s:is_empty() then
|
||||
return compactor_fault(pos) -- oops
|
||||
end
|
||||
recipe = compactor_recipes[s:get_name()] -- (reference!)
|
||||
if not recipe or not recipe.time then
|
||||
return compactor_fault(pos) -- oops
|
||||
end
|
||||
if itemcnt < 0 then
|
||||
itemcnt = recipe.time -- compact again
|
||||
end
|
||||
itemcnt = itemcnt - 1
|
||||
if itemcnt == 0 then
|
||||
inv:add_item("dst", recipe.output)
|
||||
inv:set_stack("cur", 1, ItemStack({}))
|
||||
inv:set_stack("cic", 1, ItemStack({}))
|
||||
itemcnt = -1
|
||||
else
|
||||
prodtime = recipe.time
|
||||
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_WORK_TIME
|
||||
else
|
||||
-- oops
|
||||
return compactor_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_WORK_TIME,
|
||||
100 * (recipe.time - itemcnt) / prodtime, recipe_idx, true))
|
||||
return true
|
||||
end
|
||||
|
||||
--[[
|
||||
-----------------
|
||||
Node registration
|
||||
-----------------
|
||||
]]--
|
||||
|
||||
minetest.register_node("biogasmachines:compactor", {
|
||||
description = "Tubelib Compactor",
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"biogasmachines_compactor_top.png",
|
||||
"biogasmachines_bottom.png",
|
||||
"biogasmachines_compactor_side.png",
|
||||
"biogasmachines_compactor_side.png",
|
||||
"biogasmachines_compactor_side.png",
|
||||
"biogasmachines_compactor_side.png",
|
||||
},
|
||||
drawtype = "nodebox",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{ -0.5, -0.5, -0.5, 0.5, 0.375, 0.5 },
|
||||
{ -0.375, 0.4375, -0.375, 0.375, 0.5, 0.375 },
|
||||
{ -0.3125, 0.375, -0.3125, 0.3125, 0.4375, 0.3125 },
|
||||
}
|
||||
},
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = { -0.5, -0.5, -0.5, 0.5, 0.375, 0.5 },
|
||||
},
|
||||
|
||||
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:compactor")
|
||||
local inv = meta:get_inventory()
|
||||
inv:set_size('src', INV_H * INV_IN_W)
|
||||
inv:set_size('cur', 1) -- working tray (item)
|
||||
inv:set_size('cic', 1) -- working tray (ice)
|
||||
inv:set_size('fuel', 1)
|
||||
inv:set_size('ice', 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_int("recipe_idx", 1)
|
||||
meta:set_string("infotext", label .. " " .. number .. ": stopped")
|
||||
meta:set_string("formspec", formspec(tubelib.STOPPED, 0, 0, 1, true))
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_node("biogasmachines:compactor_active", {
|
||||
description = "Tubelib Compactor",
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
{
|
||||
image = "biogasmachines_compactor_active_top.png",
|
||||
backface_culling = false,
|
||||
animation = {
|
||||
type = "vertical_frames",
|
||||
aspect_w = 32,
|
||||
aspect_h = 32,
|
||||
length = 2.0,
|
||||
},
|
||||
},
|
||||
"biogasmachines_bottom.png",
|
||||
"biogasmachines_compactor_active_side.png",
|
||||
"biogasmachines_compactor_active_side.png",
|
||||
"biogasmachines_compactor_active_side.png",
|
||||
"biogasmachines_compactor_active_side.png",
|
||||
},
|
||||
drawtype = "nodebox",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{ -0.5, -0.5, -0.5, 0.5, 0.375, 0.5 },
|
||||
{ -0.25, 0.4375, -0.25, 0.25, 0.5, 0.25 },
|
||||
{ -0.375, 0.375, -0.375, 0.375, 0.4375, 0.375 },
|
||||
},
|
||||
},
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = { -0.5, -0.5, -0.5, 0.5, 0.375, 0.5 },
|
||||
},
|
||||
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
paramtype2 = "facedir",
|
||||
groups = { crumbly = 0, not_in_creative_inventory = 1 },
|
||||
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,
|
||||
drop = "biogasmachines:compactor",
|
||||
})
|
||||
tubelib.register_node("biogasmachines:compactor", { "biogasmachines:compactor_active" }, {
|
||||
|
||||
on_push_item = function(pos, side, item)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local item_name = item:get_name()
|
||||
if item_name == "tubelib_addons1:biogas" then
|
||||
return tubelib.put_item(meta, "fuel", item)
|
||||
elseif item_name == "default:ice" then
|
||||
return tubelib.put_item(meta, "ice", item)
|
||||
elseif compactor_recipes[item_name] then
|
||||
return tubelib.put_item(meta, "src", item)
|
||||
end
|
||||
return false
|
||||
end,
|
||||
|
||||
on_pull_item = function(pos, side)
|
||||
local meta = minetest.get_meta(pos)
|
||||
return tubelib.get_item(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
|
||||
compactor_start(pos)
|
||||
elseif topic == "off" then
|
||||
compactor_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:compactor",
|
||||
recipe = {
|
||||
{ "default:obsidian_block", "biogasmachines:gasfurnace", "" },
|
||||
{ "biogasmachines:freezer", "default:diamondblock", "" },
|
||||
{ "", "", "" },
|
||||
},
|
||||
})
|
||||
|
||||
--[[
|
||||
-------
|
||||
Recipes
|
||||
-------
|
||||
]]--
|
||||
|
||||
-- Unified Inventory hints
|
||||
if minetest.get_modpath("unified_inventory") and unified_inventory then
|
||||
unified_inventory.register_craft_type("compactor", {
|
||||
description = "Compactor",
|
||||
icon = 'biogasmachines_compactor_top.png',
|
||||
width = 1,
|
||||
height = 1,
|
||||
})
|
||||
end
|
||||
|
||||
-- default recipes
|
||||
if minetest.get_modpath("gravelsieve") and gravelsieve then
|
||||
biogasmachines.add_compactor_recipe({
|
||||
input = "gravelsieve:compressed_gravel 8",
|
||||
output = "default:obsidian 1",
|
||||
time = 12,
|
||||
})
|
||||
end
|
||||
|
||||
biogasmachines.add_compactor_recipe({
|
||||
input = "default:cobble 4",
|
||||
output = "default:obsidian 1",
|
||||
time = 8,
|
||||
})
|
||||
|
||||
biogasmachines.add_compactor_recipe({
|
||||
input = "default:mossycobble 4",
|
||||
output = "default:obsidian 1",
|
||||
time = 8,
|
||||
})
|
||||
|
||||
biogasmachines.add_compactor_recipe({
|
||||
input = "default:desert_cobble 4",
|
||||
output = "default:obsidian 1",
|
||||
time = 8,
|
||||
})
|
||||
|
||||
biogasmachines.add_compactor_recipe({
|
||||
input = "default:coalblock 4",
|
||||
output = "default:diamond 1",
|
||||
time = 16,
|
||||
})
|
||||
|
||||
biogasmachines.add_compactor_recipe({
|
||||
input = "default:flint 4",
|
||||
output = "default:obsidian_shard 1",
|
||||
time = 4,
|
||||
})
|
@ -3,6 +3,7 @@ bucket
|
||||
farming
|
||||
tubelib
|
||||
tubelib_addons1
|
||||
gravelsieve?
|
||||
pipeworks?
|
||||
unified_inventory?
|
||||
moreores?
|
||||
|
@ -1,16 +0,0 @@
|
||||
--[[
|
||||
|
||||
=======================================================================
|
||||
Tubelib Biogas Machines Mod
|
||||
by Micu (c) 2018
|
||||
|
||||
Copyright (C) 2018 Michal Cieslakiewicz
|
||||
|
||||
HighTemp Compressor
|
||||
|
||||
License: LGPLv2.1+
|
||||
=======================================================================
|
||||
|
||||
]]--
|
||||
|
||||
-- TODO: put machine code here
|
@ -22,4 +22,4 @@ dofile(minetest.get_modpath("biogasmachines").."/freezer.lua")
|
||||
dofile(minetest.get_modpath("biogasmachines").."/gasifier.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").."/compactor.lua")
|
||||
|
BIN
biogasmachines/textures/biogasmachines_compactor_active_side.png
Normal file
BIN
biogasmachines/textures/biogasmachines_compactor_active_side.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 950 B |
BIN
biogasmachines/textures/biogasmachines_compactor_active_top.png
Normal file
BIN
biogasmachines/textures/biogasmachines_compactor_active_top.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.5 KiB |
BIN
biogasmachines/textures/biogasmachines_compactor_inv_bg.png
Normal file
BIN
biogasmachines/textures/biogasmachines_compactor_inv_bg.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 197 B |
BIN
biogasmachines/textures/biogasmachines_compactor_inv_fg.png
Normal file
BIN
biogasmachines/textures/biogasmachines_compactor_inv_fg.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 310 B |
BIN
biogasmachines/textures/biogasmachines_compactor_side.png
Normal file
BIN
biogasmachines/textures/biogasmachines_compactor_side.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 980 B |
BIN
biogasmachines/textures/biogasmachines_compactor_top.png
Normal file
BIN
biogasmachines/textures/biogasmachines_compactor_top.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 979 B |
Loading…
x
Reference in New Issue
Block a user