OpenMiner/mods/furnace.lua

75 lines
2.4 KiB
Lua

mod:block {
id = "furnace",
name = "Furnace",
-- texture = 164, -- Vanilla
texture = 205, -- Faithful 32x
on_block_activated = function(pos, player, world, client)
local gui = LuaGUI.new()
-- FIXME: Replace this by gui:set_size() and gui:set_centered()
local gui_pos = {
x = SCREEN_WIDTH / GUI_SCALE / 2.0 - 176 / 2.0,
y = SCREEN_HEIGHT / GUI_SCALE / 2.0 - 166 / 2.0
}
gui:furnace {
name = "furnace",
pos = gui_pos,
block = {x = pos.x, y = pos.y, z = pos.z}
}
gui:show(client)
end,
on_tick = function(pos, player, chunk, world)
local data = world:get_block_data(pos.x, pos.y, pos.z)
if not data then return end
local input_stack = data.inventory:get_stack(0, 0)
local output_stack = data.inventory:get_stack(1, 0)
local fuel_stack = data.inventory:get_stack(2, 0)
local ticks_remaining = bit.band(data.data, 0xfff)
local current_burn_time = bit.band(bit.brshift(data.data, 12), 0xfff)
local item_progress = bit.band(bit.brshift(data.data, 24), 0xff)
-- print(data.data);
local recipe = openminer:registry():get_recipe(data.inventory)
if recipe and recipe:type() ~= "smelt" then
recipe = nil
end
if ticks_remaining == 0 and recipe and fuel_stack:amount() > 0 and
(output_stack:item():id() == 0 or output_stack:amount() == 0
or output_stack:item():id() == recipe:result():item():id()) then
ticks_remaining = fuel_stack:item():burn_time()
current_burn_time = fuel_stack:item():burn_time()
world:set_data(pos.x, pos.y, pos.z, 1)
elseif ticks_remaining > 0 then
ticks_remaining = ticks_remaining - 1
if recipe and (output_stack:item():id() == 0 or output_stack:amount() == 0
or output_stack:item():id() == recipe:result():item():id()) then
item_progress = item_progress + 1
else
item_progress = 0
end
elseif ticks_remaining == 0 then
current_burn_time = 0
world:set_data(pos.x, pos.y, pos.z, 0)
end
if item_progress >= 200 and recipe then
item_progress = 0;
data.inventory:set_stack(0, 0, (input_stack:amount() - 1 > 0) and input_stack:item():name() or "", input_stack:amount() - 1)
data.inventory:set_stack(1, 0, recipe:result():item():name(), output_stack:amount() + recipe:result():amount())
end
local a = bit.blshift(bit.band(current_burn_time, 0xfff), 12)
local b = bit.blshift(bit.band(item_progress, 0xff), 24)
data.data = bit.band(ticks_remaining, 0xfff) + a + b
end,
}