furnace added
@ -324,7 +324,7 @@ function techage.transfer(pos, outdir, topic, payload, network, nodenames)
|
||||
if network then
|
||||
dpos, indir = network:get_connected_node_pos(pos, outdir)
|
||||
else
|
||||
dpos, indir = tubelib2.get_pos(pos, outdir)
|
||||
dpos, indir = tubelib2.get_pos(pos, outdir), outdir
|
||||
end
|
||||
-- check node name
|
||||
local name = techage.get_node_lvm(dpos).name
|
||||
|
@ -42,21 +42,35 @@ function techage.firebox.formspec(mem)
|
||||
if mem.running then
|
||||
fuel_percent = ((mem.burn_cycles or 1) * 100) / (mem.burn_cycles_total or 1)
|
||||
end
|
||||
local power_level = mem.power_level or 4
|
||||
return "size[8,6.5]"..
|
||||
default.gui_bg..
|
||||
default.gui_bg_img..
|
||||
default.gui_slots..
|
||||
"list[current_name;fuel;1,0.5;1,1;]"..
|
||||
"image[2,0.5;1,1;default_furnace_fire_bg.png^[lowpart:"..
|
||||
fuel_percent..":default_furnace_fire_fg.png]"..
|
||||
"label[4.5,0.1;"..I("Power")..":]"..
|
||||
"dropdown[6,0;1.8;power_level;25%,50%,75%,100%;"..power_level.."]"..
|
||||
"button[1,1.5;1.8,1;update;"..I("Update").."]"..
|
||||
"list[current_player;main;0,2.8;8,4;]"..
|
||||
"listring[current_name;fuel]"..
|
||||
"listring[current_player;main]"..
|
||||
default.get_hotbar_bg(0, 2.8)
|
||||
if mem.power_level then
|
||||
return "size[8,6.5]"..
|
||||
default.gui_bg..
|
||||
default.gui_bg_img..
|
||||
default.gui_slots..
|
||||
"list[current_name;fuel;1,0.5;1,1;]"..
|
||||
"image[2,0.5;1,1;default_furnace_fire_bg.png^[lowpart:"..
|
||||
fuel_percent..":default_furnace_fire_fg.png]"..
|
||||
"label[4.5,0.1;"..I("Power")..":]"..
|
||||
"dropdown[6,0;1.8;power_level;25%,50%,75%,100%;"..power_level.."]"..
|
||||
"button[1,1.5;1.8,1;update;"..I("Update").."]"..
|
||||
"list[current_player;main;0,2.8;8,4;]"..
|
||||
"listring[current_name;fuel]"..
|
||||
"listring[current_player;main]"..
|
||||
default.get_hotbar_bg(0, 2.8)
|
||||
else
|
||||
return "size[8,6]"..
|
||||
default.gui_bg..
|
||||
default.gui_bg_img..
|
||||
default.gui_slots..
|
||||
"list[current_name;fuel;1,0.5;1,1;]"..
|
||||
"image[3,0.5;1,1;default_furnace_fire_bg.png^[lowpart:"..
|
||||
fuel_percent..":default_furnace_fire_fg.png]"..
|
||||
"button[5,0.5;1.8,1;update;"..I("Update").."]"..
|
||||
"list[current_player;main;0,2;8,4;]"..
|
||||
"listring[current_name;fuel]"..
|
||||
"listring[current_player;main]"..
|
||||
default.get_hotbar_bg(0, 2)
|
||||
end
|
||||
end
|
||||
|
||||
function techage.firebox.can_dig(pos, player)
|
||||
@ -129,3 +143,8 @@ function techage.firebox.get_fuel(pos)
|
||||
end
|
||||
end
|
||||
|
||||
function techage.firebox.has_fuel(pos)
|
||||
local inv = M(pos):get_inventory()
|
||||
local items = inv:get_stack("fuel", 1)
|
||||
return items:get_count() > 0
|
||||
end
|
||||
|
@ -35,6 +35,13 @@ function techage.one_of(val, selection)
|
||||
return selection[1]
|
||||
end
|
||||
|
||||
function techage.index(list, x)
|
||||
for idx, v in pairs(list) do
|
||||
if v == x then return idx end
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
function techage.get_node_lvm(pos)
|
||||
local node = minetest.get_node_or_nil(pos)
|
||||
if node then
|
||||
|
@ -103,6 +103,7 @@ minetest.register_node("techage:coalfirebox", {
|
||||
local mem = tubelib2.init_mem(pos)
|
||||
mem.running = false
|
||||
mem.burn_cycles = 0
|
||||
mem.power_level = 4
|
||||
local meta = M(pos)
|
||||
meta:set_string("formspec", firebox.formspec(mem))
|
||||
local inv = meta:get_inventory()
|
||||
@ -189,11 +190,14 @@ techage.register_node({"techage:coalfirebox"}, {
|
||||
return techage.get_items(inv, "fuel", num)
|
||||
end,
|
||||
on_push_item = function(pos, in_dir, stack)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
local mem = tubelib2.get_mem(pos)
|
||||
start_firebox(pos, mem)
|
||||
return techage.put_items(inv, "fuel", stack)
|
||||
if firebox.Burntime[stack:get_name()] then
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
local mem = tubelib2.get_mem(pos)
|
||||
start_firebox(pos, mem)
|
||||
return techage.put_items(inv, "fuel", stack)
|
||||
end
|
||||
return false
|
||||
end,
|
||||
on_unpull_item = function(pos, in_dir, stack)
|
||||
local meta = minetest.get_meta(pos)
|
||||
|
208
furnace/booster.lua
Normal file
@ -0,0 +1,208 @@
|
||||
--[[
|
||||
|
||||
TechAge
|
||||
=======
|
||||
|
||||
Copyright (C) 2019 Joachim Stolberg
|
||||
|
||||
LGPLv2.1+
|
||||
See LICENSE.txt for more information
|
||||
|
||||
TA3 Booster
|
||||
|
||||
]]--
|
||||
|
||||
-- for lazy programmers
|
||||
local S = function(pos) if pos then return minetest.pos_to_string(pos) end end
|
||||
local P = minetest.string_to_pos
|
||||
local M = minetest.get_meta
|
||||
|
||||
-- Load support for intllib.
|
||||
local MP = minetest.get_modpath("techage")
|
||||
local I,_ = dofile(MP.."/intllib.lua")
|
||||
|
||||
local POWER_CONSUMPTION = 3
|
||||
|
||||
local Power = techage.ElectricCable
|
||||
|
||||
local function infotext(pos, state)
|
||||
M(pos):set_string("infotext", I("TA3 Booster")..": "..state)
|
||||
end
|
||||
|
||||
local function swap_node(pos, name)
|
||||
local node = minetest.get_node(pos)
|
||||
if node.name == name then
|
||||
return
|
||||
end
|
||||
node.name = name
|
||||
minetest.swap_node(pos, node)
|
||||
end
|
||||
|
||||
local function play_sound(pos)
|
||||
local mem = tubelib2.get_mem(pos)
|
||||
if mem.running then
|
||||
mem.handle = minetest.sound_play("techage_booster", {
|
||||
pos = pos,
|
||||
gain = 1,
|
||||
max_hear_distance = 7})
|
||||
minetest.after(2, play_sound, pos)
|
||||
end
|
||||
end
|
||||
|
||||
local function stop_sound(pos)
|
||||
local mem = tubelib2.get_mem(pos)
|
||||
if mem.handle then
|
||||
minetest.sound_stop(mem.handle)
|
||||
mem.handle = nil
|
||||
end
|
||||
end
|
||||
|
||||
local function on_power_pass1(pos, mem)
|
||||
--print("on_power_pass1")
|
||||
if mem.running then
|
||||
mem.correction = POWER_CONSUMPTION
|
||||
else
|
||||
mem.correction = 0
|
||||
end
|
||||
return mem.correction
|
||||
end
|
||||
|
||||
local function on_power_pass2(pos, mem, sum)
|
||||
if sum > 0 then
|
||||
mem.has_power = true
|
||||
return 0
|
||||
else
|
||||
mem.has_power = false
|
||||
return -mem.correction
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_node("techage:ta3_booster", {
|
||||
description = I("TA3 Booster"),
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"techage_filling_ta3.png^techage_appl_arrow.png^techage_frame_ta3.png",
|
||||
"techage_filling_ta3.png^techage_frame_ta3.png",
|
||||
"techage_filling_ta3.png^techage_appl_hole_biogas.png^techage_frame_ta3.png",
|
||||
"techage_filling_ta3.png^techage_appl_hole_biogas.png^techage_frame_ta3.png",
|
||||
"techage_filling_ta3.png^techage_appl_compressor.png^techage_frame_ta3.png",
|
||||
"techage_filling_ta3.png^techage_appl_compressor.png^[transformFX^techage_frame_ta3.png",
|
||||
},
|
||||
|
||||
on_construct = tubelib2.init_mem,
|
||||
|
||||
after_place_node = function(pos, placer)
|
||||
local node = minetest.get_node(pos)
|
||||
local indir = techage.side_to_indir("R", node.param2)
|
||||
M(pos):set_int("indir", indir)
|
||||
infotext(pos, "stopped")
|
||||
end,
|
||||
|
||||
paramtype2 = "facedir",
|
||||
groups = {cracky=2, crumbly=2, choppy=2},
|
||||
on_rotate = screwdriver.disallow,
|
||||
is_ground_content = false,
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
})
|
||||
|
||||
|
||||
minetest.register_node("techage:ta3_booster_on", {
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"techage_filling_ta3.png^techage_appl_arrow.png^techage_frame_ta3.png",
|
||||
"techage_filling_ta3.png^techage_frame_ta3.png",
|
||||
"techage_filling_ta3.png^techage_appl_hole_biogas.png^techage_frame_ta3.png",
|
||||
"techage_filling_ta3.png^techage_appl_hole_biogas.png^techage_frame_ta3.png",
|
||||
{
|
||||
image = "techage_filling4_ta3.png^techage_appl_compressor4.png^techage_frame4_ta3.png",
|
||||
backface_culling = false,
|
||||
animation = {
|
||||
type = "vertical_frames",
|
||||
aspect_w = 32,
|
||||
aspect_h = 32,
|
||||
length = 0.2,
|
||||
},
|
||||
},
|
||||
{
|
||||
image = "techage_filling4_ta3.png^techage_appl_compressor4.png^[transformFX]^techage_frame4_ta3.png",
|
||||
backface_culling = false,
|
||||
animation = {
|
||||
type = "vertical_frames",
|
||||
aspect_w = 32,
|
||||
aspect_h = 32,
|
||||
length = 0.2,
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
paramtype2 = "facedir",
|
||||
groups = {not_in_creative_inventory = 1},
|
||||
diggable = false,
|
||||
on_rotate = screwdriver.disallow,
|
||||
is_ground_content = false,
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
})
|
||||
|
||||
techage.power.register_node({"techage:ta3_booster", "techage:ta3_booster_on"}, {
|
||||
on_power_pass1 = on_power_pass1,
|
||||
on_power_pass2 = on_power_pass2,
|
||||
power_network = Power,
|
||||
conn_sides = {"F", "B", "U", "D"},
|
||||
})
|
||||
|
||||
-- for intra machine communication
|
||||
techage.register_node({"techage:ta3_booster", "techage:ta3_booster_on"}, {
|
||||
on_transfer = function(pos, in_dir, topic, payload)
|
||||
--print("ta3_booster", topic, payload, in_dir)
|
||||
if M(pos):get_int("indir") == in_dir then
|
||||
local mem = tubelib2.get_mem(pos)
|
||||
if topic == "power" then
|
||||
return mem.has_power
|
||||
elseif topic == "start" then
|
||||
if mem.has_power then
|
||||
mem.running = true
|
||||
play_sound(pos)
|
||||
swap_node(pos, "techage:ta3_booster_on")
|
||||
infotext(pos, "running")
|
||||
techage.power.power_distribution(pos)
|
||||
else
|
||||
infotext(pos, "no power")
|
||||
end
|
||||
elseif topic == "stop" then
|
||||
mem.running = false
|
||||
stop_sound(pos)
|
||||
swap_node(pos, "techage:ta3_booster")
|
||||
if mem.has_power then
|
||||
infotext(pos, "stopped")
|
||||
else
|
||||
infotext(pos, "no power")
|
||||
end
|
||||
techage.power.power_distribution(pos)
|
||||
end
|
||||
end
|
||||
end
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "techage:ta3_booster",
|
||||
recipe = {
|
||||
{"basic_materials:steel_bar", "default:wood", "basic_materials:steel_bar"},
|
||||
{"techage:steam_pipeS", "basic_materials:gear_steel", "techage:steam_pipeS"},
|
||||
{"basic_materials:steel_bar", "default:wood", "basic_materials:steel_bar"},
|
||||
},
|
||||
})
|
||||
|
||||
techage.register_help_page(I("TA3 Booster"),
|
||||
I([[Part of the TA3 Furnace and further machines.
|
||||
Used to increase the air/gas pressure.]]), "techage:ta3_booster")
|
||||
|
||||
|
||||
minetest.register_lbm({
|
||||
label = "[techage] Booster sound",
|
||||
name = "techage:booster",
|
||||
nodenames = {"techage:ta3_booster_on"},
|
||||
run_at_every_load = true,
|
||||
action = function(pos, node)
|
||||
play_sound(pos)
|
||||
end
|
||||
})
|
118
furnace/cooking.lua
Normal file
@ -0,0 +1,118 @@
|
||||
--[[
|
||||
|
||||
TechAge
|
||||
=======
|
||||
|
||||
Copyright (C) 2019 Joachim Stolberg
|
||||
|
||||
LGPLv2.1+
|
||||
See LICENSE.txt for more information
|
||||
|
||||
Cooking routines for furnace
|
||||
|
||||
]]--
|
||||
|
||||
-- for lazy programmers
|
||||
local S = function(pos) if pos then return minetest.pos_to_string(pos) end end
|
||||
local P = minetest.string_to_pos
|
||||
local M = minetest.get_meta
|
||||
|
||||
-- Load support for intllib.
|
||||
local MP = minetest.get_modpath("techage")
|
||||
local I,_ = dofile(MP.."/intllib.lua")
|
||||
|
||||
local Recipes = {} -- registered recipes
|
||||
local KeyList = {} -- index to Recipes key translation
|
||||
local NumRecipes = 0
|
||||
|
||||
techage.furnace = {}
|
||||
|
||||
-- move recipe src items to output inventory
|
||||
local function process(inv, recipe)
|
||||
local res
|
||||
-- check if all ingredients are available
|
||||
for _,item in ipairs(recipe.input) do
|
||||
if not inv:contains_item("src", item) then
|
||||
return false
|
||||
end
|
||||
end
|
||||
-- remove items
|
||||
for _,item in ipairs(recipe.input) do
|
||||
inv:remove_item("src", item)
|
||||
end
|
||||
-- add to dst
|
||||
local stack = ItemStack(recipe.output)
|
||||
stack:set_count(recipe.number)
|
||||
inv:add_item("dst", stack)
|
||||
return true
|
||||
end
|
||||
|
||||
function techage.furnace.smelting(pos, mem, elapsed)
|
||||
local inv = M(pos):get_inventory()
|
||||
local state = techage.STANDBY
|
||||
if inv and not inv:is_empty("src") then
|
||||
local key = KeyList[mem.recipe_idx or 1] or KeyList[1]
|
||||
local recipe = Recipes[key]
|
||||
-- check dst inv
|
||||
local item = ItemStack(recipe.output)
|
||||
if not inv:room_for_item("dst", item) then
|
||||
return techage.BLOCKED
|
||||
end
|
||||
|
||||
elapsed = elapsed + (mem.leftover or 0)
|
||||
while elapsed >= recipe.time do
|
||||
if process(inv, recipe) == false then
|
||||
mem.leftover = 0
|
||||
return techage.STANDBY
|
||||
else
|
||||
state = techage.RUNNING
|
||||
end
|
||||
elapsed = elapsed - recipe.time
|
||||
end
|
||||
mem.leftover = elapsed
|
||||
return state
|
||||
end
|
||||
return techage.STANDBY
|
||||
end
|
||||
|
||||
function techage.furnace.get_output(idx)
|
||||
local key = KeyList[idx] or KeyList[1]
|
||||
return Recipes[key].output
|
||||
end
|
||||
|
||||
function techage.furnace.get_num_recipes()
|
||||
return NumRecipes
|
||||
end
|
||||
|
||||
function techage.furnace.reset_cooking(mem)
|
||||
mem.leftover = 0
|
||||
end
|
||||
|
||||
|
||||
if minetest.global_exists("unified_inventory") then
|
||||
unified_inventory.register_craft_type("ta3_melting", {
|
||||
description = I("TA3 Melting"),
|
||||
icon = "techage_concrete.png^techage_appl_furnace.png^techage_frame_ta3.png",
|
||||
width = 2,
|
||||
height = 2,
|
||||
})
|
||||
end
|
||||
|
||||
function techage.furnace.register_recipe(recipe)
|
||||
local output = string.split(recipe.output, " ")
|
||||
local number = tonumber(output[2] or 1)
|
||||
table.insert(KeyList, output)
|
||||
Recipes[output] = {
|
||||
input = recipe.recipe,
|
||||
output = output[1],
|
||||
number = number,
|
||||
time = math.max((recipe.time or 3) * number, 2),
|
||||
}
|
||||
NumRecipes = NumRecipes + 1
|
||||
|
||||
if minetest.global_exists("unified_inventory") then
|
||||
recipe.items = recipe.recipe
|
||||
recipe.type = "ta3_melting"
|
||||
unified_inventory.register_craft(recipe)
|
||||
end
|
||||
end
|
212
furnace/firebox.lua
Normal file
@ -0,0 +1,212 @@
|
||||
--[[
|
||||
|
||||
TechAge
|
||||
=======
|
||||
|
||||
Copyright (C) 2019 Joachim Stolberg
|
||||
|
||||
LGPLv2.1+
|
||||
See LICENSE.txt for more information
|
||||
|
||||
TA3 Industrial Furnace Firebox
|
||||
|
||||
]]--
|
||||
|
||||
-- for lazy programmers
|
||||
local S = function(pos) if pos then return minetest.pos_to_string(pos) end end
|
||||
local P = minetest.string_to_pos
|
||||
local M = minetest.get_meta
|
||||
|
||||
-- Load support for intllib.
|
||||
local MP = minetest.get_modpath("techage")
|
||||
local I,_ = dofile(MP.."/intllib.lua")
|
||||
|
||||
local firebox = techage.firebox
|
||||
|
||||
local CYCLE_TIME = 2
|
||||
|
||||
local function has_fuel(pos, mem)
|
||||
return mem.burn_cycles > 0 or firebox.has_fuel(pos)
|
||||
end
|
||||
|
||||
local function stop_firebox(pos, mem)
|
||||
mem.running = false
|
||||
firebox.swap_node(pos, "techage:furnace_firebox")
|
||||
minetest.get_node_timer(pos):stop()
|
||||
M(pos):set_string("formspec", firebox.formspec(mem))
|
||||
end
|
||||
|
||||
local function node_timer(pos, elapsed)
|
||||
local mem = tubelib2.get_mem(pos)
|
||||
if mem.running then
|
||||
mem.burn_cycles = (mem.burn_cycles or 0) - 1
|
||||
if mem.burn_cycles <= 0 then
|
||||
local taken = firebox.get_fuel(pos)
|
||||
if taken then
|
||||
mem.burn_cycles = firebox.Burntime[taken:get_name()] / CYCLE_TIME
|
||||
mem.burn_cycles_total = mem.burn_cycles
|
||||
else
|
||||
stop_firebox(pos, mem)
|
||||
return false
|
||||
end
|
||||
end
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
local function start_firebox(pos, mem)
|
||||
if not mem.running then
|
||||
mem.running = true
|
||||
node_timer(pos, 0)
|
||||
firebox.swap_node(pos, "techage:furnace_firebox_on")
|
||||
minetest.get_node_timer(pos):start(CYCLE_TIME)
|
||||
M(pos):set_string("formspec", firebox.formspec(mem))
|
||||
end
|
||||
end
|
||||
|
||||
local function booster_cmnd(pos, cmnd)
|
||||
return techage.transfer(
|
||||
pos,
|
||||
"L", -- outdir
|
||||
cmnd, -- topic
|
||||
nil, -- payload
|
||||
nil, -- network
|
||||
{"techage:ta3_booster", "techage:ta3_booster_on"})
|
||||
end
|
||||
|
||||
minetest.register_node("techage:furnace_firebox", {
|
||||
description = I("TA3 Furnace Firebox"),
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"techage_concrete.png^techage_appl_open.png^techage_frame_ta3.png",
|
||||
"techage_concrete.png^techage_frame_ta3.png",
|
||||
"techage_concrete.png^techage_frame_ta3.png",
|
||||
"techage_concrete.png^techage_appl_hole_biogas.png^techage_frame_ta3.png",
|
||||
"techage_concrete.png^techage_frame_ta3.png",
|
||||
"techage_concrete.png^techage_appl_firehole.png^techage_frame_ta3.png",
|
||||
},
|
||||
paramtype2 = "facedir",
|
||||
on_rotate = screwdriver.disallow,
|
||||
groups = {cracky=2},
|
||||
is_ground_content = false,
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
|
||||
on_timer = node_timer,
|
||||
can_dig = firebox.can_dig,
|
||||
allow_metadata_inventory_put = firebox.allow_metadata_inventory,
|
||||
allow_metadata_inventory_take = firebox.allow_metadata_inventory,
|
||||
on_receive_fields = firebox.on_receive_fields,
|
||||
on_rightclick = firebox.on_rightclick,
|
||||
|
||||
on_construct = function(pos)
|
||||
local mem = tubelib2.init_mem(pos)
|
||||
mem.running = false
|
||||
mem.burn_cycles = 0
|
||||
local meta = M(pos)
|
||||
meta:set_string("formspec", firebox.formspec(mem))
|
||||
local inv = meta:get_inventory()
|
||||
inv:set_size('fuel', 1)
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_node("techage:furnace_firebox_on", {
|
||||
description = I("TA3 Furnace Firebox"),
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"techage_concrete.png^techage_frame_ta3.png",
|
||||
"techage_concrete.png^techage_frame_ta3.png",
|
||||
"techage_concrete.png^techage_frame_ta3.png",
|
||||
"techage_concrete.png^techage_frame_ta3.png",
|
||||
"techage_concrete.png^techage_frame_ta3.png",
|
||||
{
|
||||
image = "techage_concrete4.png^techage_appl_firehole4.png^techage_frame4_ta3.png",
|
||||
backface_culling = false,
|
||||
animation = {
|
||||
type = "vertical_frames",
|
||||
aspect_w = 32,
|
||||
aspect_h = 32,
|
||||
length = 0.4,
|
||||
},
|
||||
},
|
||||
},
|
||||
paramtype2 = "facedir",
|
||||
light_source = 8,
|
||||
on_rotate = screwdriver.disallow,
|
||||
diggable = false,
|
||||
groups = {not_in_creative_inventory = 1},
|
||||
is_ground_content = false,
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
drop = "techage:furnace_firebox",
|
||||
|
||||
on_timer = node_timer,
|
||||
can_dig = firebox.can_dig,
|
||||
allow_metadata_inventory_put = firebox.allow_metadata_inventory,
|
||||
allow_metadata_inventory_take = firebox.allow_metadata_inventory,
|
||||
on_receive_fields = firebox.on_receive_fields,
|
||||
on_rightclick = firebox.on_rightclick,
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "techage:furnace_firebox",
|
||||
recipe = {
|
||||
{'techage:basalt_stone', 'techage:basalt_stone', 'techage:basalt_stone'},
|
||||
{'default:steel_ingot', '', 'default:steel_ingot'},
|
||||
{'techage:basalt_stone', 'techage:basalt_stone', 'techage:basalt_stone'},
|
||||
},
|
||||
})
|
||||
|
||||
techage.register_node({"techage:furnace_firebox", "techage:furnace_firebox_on"}, {
|
||||
on_pull_item = function(pos, in_dir, num)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
return techage.get_items(inv, "fuel", num)
|
||||
end,
|
||||
on_push_item = function(pos, in_dir, stack)
|
||||
if firebox.Burntime[stack:get_name()] then
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
local mem = tubelib2.get_mem(pos)
|
||||
return techage.put_items(inv, "fuel", stack)
|
||||
end
|
||||
return false
|
||||
end,
|
||||
on_unpull_item = function(pos, in_dir, stack)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
return techage.put_items(inv, "fuel", stack)
|
||||
end,
|
||||
on_recv_message = function(pos, topic, payload)
|
||||
if topic == "state" then
|
||||
local meta = minetest.get_meta(pos)
|
||||
return techage.get_inv_state(meta, "fuel")
|
||||
else
|
||||
return "unsupported"
|
||||
end
|
||||
end,
|
||||
-- called from furnace_top
|
||||
on_transfer = function(pos, in_dir, topic, payload)
|
||||
--print("on_transfer", topic, payload)
|
||||
if topic == "fuel" then
|
||||
local mem = tubelib2.get_mem(pos)
|
||||
return has_fuel(pos, mem) and booster_cmnd(pos, "power")
|
||||
elseif topic == "start" then
|
||||
local mem = tubelib2.get_mem(pos)
|
||||
start_firebox(pos, mem)
|
||||
booster_cmnd(pos, "start")
|
||||
elseif topic == "stop" then
|
||||
local mem = tubelib2.get_mem(pos)
|
||||
stop_firebox(pos, mem)
|
||||
booster_cmnd(pos, "stop")
|
||||
end
|
||||
end
|
||||
})
|
||||
|
||||
minetest.register_lbm({
|
||||
label = "[techage] Furnace firebox",
|
||||
name = "techage:furnace",
|
||||
nodenames = {"techage:furnace_firebox_on"},
|
||||
run_at_every_load = true,
|
||||
action = function(pos, node)
|
||||
minetest.get_node_timer(pos):start(CYCLE_TIME)
|
||||
end
|
||||
})
|
667
furnace/furnace__.lua
Normal file
@ -0,0 +1,667 @@
|
||||
|
||||
--[[
|
||||
|
||||
=======================================================================
|
||||
Tubelib Biogas Machines Mod
|
||||
by Micu (c) 2018, 2019
|
||||
|
||||
Copyright (C) 2018, 2019 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. However, this puts more stress on internal
|
||||
parts so machine needs to be serviced more frequently.
|
||||
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.
|
||||
|
||||
Tubelib v2 implementation info:
|
||||
* device updates itself every tick, so cycle_time must be set to 1
|
||||
even though production takes longer (start method sets timer to
|
||||
this value)
|
||||
* keep_running function is called every time item is produced
|
||||
(not every processing tick - function does not accept neither 0
|
||||
nor fractional values for num_items parameter)
|
||||
* desired_state metadata allows to properly change non-running target
|
||||
state during transition; when new state differs from old one, timer
|
||||
is reset so it is guaranteed that each countdown starts from
|
||||
COUNTDOWN_TICKS
|
||||
* num_items in keep_running method is set to 1 (default value);
|
||||
machine aging is controlled by aging_factor solely; tubelib item
|
||||
counter is used to count production iterations not actual items
|
||||
|
||||
License: LGPLv2.1+
|
||||
=======================================================================
|
||||
|
||||
]]--
|
||||
|
||||
--[[
|
||||
---------
|
||||
Variables
|
||||
---------
|
||||
]]--
|
||||
|
||||
-- Jet Furnace uses Biogas twice as fast so 1 Biogas unit burns for 20 sec
|
||||
local BIOGAS_TICKS = 20
|
||||
-- timing
|
||||
local TIMER_TICK_SEC = 1 -- Node timer tick
|
||||
local STANDBY_TICKS = 4 -- Standby mode timer frequency factor
|
||||
local COUNTDOWN_TICKS = 4 -- Ticks to 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_TICKS * TIMER_TICK_SEC)
|
||||
}
|
||||
|
||||
-- formspec
|
||||
local function formspec(self, pos, meta)
|
||||
local state = meta:get_int("tubelib_state")
|
||||
local fuel_pct = tostring(100 * meta:get_int("fuel_ticks") / BIOGAS_TICKS)
|
||||
local item_pct = tostring(100 * (1 - meta:get_int("item_ticks") / meta:get_int("item_total")))
|
||||
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:" ..
|
||||
fuel_pct .. ":biogasmachines_gasfurnace_inv_fg.png]" ..
|
||||
"image[" .. fmxy.mid_x .. ",1;1,1;gui_furnace_arrow_bg.png^[lowpart:" ..
|
||||
item_pct .. ":gui_furnace_arrow_fg.png^[transformR270]" ..
|
||||
"list[context;fuel;" .. fmxy.inv_in_w .. ",2;1,1;]" ..
|
||||
"item_image[" .. fmxy.inv_in_w .. ",2;1,1;tubelib_addons1:biogas]" ..
|
||||
"image_button[" .. fmxy.mid_x .. ",2;1,1;" ..
|
||||
self:get_state_button_image(meta) .. ";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]" ..
|
||||
"tooltip[4.5,3.25;0.5,0.5;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.88;#BF5F2F]" or
|
||||
"listring[context;cur]listring[current_player;main]") ..
|
||||
default.get_hotbar_bg(0, 4)
|
||||
end
|
||||
|
||||
--[[
|
||||
-------
|
||||
Helpers
|
||||
-------
|
||||
]]--
|
||||
|
||||
-- reset processing data
|
||||
local function state_meta_reset(pos, meta)
|
||||
meta:set_int("item_ticks", -1)
|
||||
meta:set_int("item_total", -1)
|
||||
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 (with 50/50 chance)
|
||||
-- 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
|
||||
|
||||
--[[
|
||||
-------------
|
||||
State machine
|
||||
-------------
|
||||
]]--
|
||||
|
||||
local machine = tubelib.NodeStates:new({
|
||||
node_name_passive = "biogasmachines:jetfurnace",
|
||||
node_name_active = "biogasmachines:jetfurnace_active",
|
||||
node_name_defect = "biogasmachines:jetfurnace_defect",
|
||||
infotext_name = "Biogas Jet Furnace",
|
||||
cycle_time = TIMER_TICK_SEC,
|
||||
standby_ticks = STANDBY_TICKS,
|
||||
has_item_meter = true,
|
||||
aging_factor = 20,
|
||||
on_start = function(pos, meta, oldstate)
|
||||
meta:set_int("desired_state", tubelib.RUNNING)
|
||||
state_meta_reset(pos, meta)
|
||||
end,
|
||||
on_stop = function(pos, meta, oldstate)
|
||||
meta:set_int("desired_state", tubelib.STOPPED)
|
||||
state_meta_reset(pos, meta)
|
||||
end,
|
||||
formspec_func = formspec,
|
||||
})
|
||||
|
||||
-- fault function for convenience as there is no on_fault method (yet)
|
||||
local function machine_fault(pos, meta)
|
||||
meta:set_int("desired_state", tubelib.FAULT)
|
||||
state_meta_reset(pos, meta)
|
||||
machine:fault(pos, meta)
|
||||
end
|
||||
|
||||
-- customized version of NodeStates:idle()
|
||||
local function countdown_to_halt(pos, meta, target_state)
|
||||
if target_state ~= tubelib.STANDBY and
|
||||
target_state ~= tubelib.BLOCKED and
|
||||
target_state ~= tubelib.STOPPED and
|
||||
target_state ~= tubelib.FAULT then
|
||||
return true
|
||||
end
|
||||
if machine:get_state(meta) == tubelib.RUNNING and
|
||||
meta:get_int("desired_state") ~= target_state then
|
||||
meta:set_int("tubelib_countdown", COUNTDOWN_TICKS)
|
||||
meta:set_int("desired_state", target_state)
|
||||
end
|
||||
local countdown = meta:get_int("tubelib_countdown") - 1
|
||||
if countdown >= -1 then
|
||||
-- we don't need anything less than -1
|
||||
meta:set_int("tubelib_countdown", countdown)
|
||||
end
|
||||
if countdown < 0 then
|
||||
if machine:get_state(meta) == target_state then
|
||||
return true
|
||||
end
|
||||
meta:set_int("desired_state", target_state)
|
||||
-- workaround for switching between non-running states
|
||||
meta:set_int("tubelib_state", tubelib.RUNNING)
|
||||
if target_state == tubelib.FAULT then
|
||||
machine_fault(pos, meta)
|
||||
elseif target_state == tubelib.STOPPED then
|
||||
machine:stop(pos, meta)
|
||||
elseif target_state == tubelib.BLOCKED then
|
||||
machine:blocked(pos, meta)
|
||||
else
|
||||
machine:standby(pos, meta)
|
||||
end
|
||||
return false
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
-- countdown to one of two states depending on fuel availability
|
||||
local function fuel_countdown_to_halt(pos, meta, target_state_fuel, target_state_empty)
|
||||
local inv = meta:get_inventory()
|
||||
if meta:get_int("fuel_ticks") == 0 and inv:is_empty("fuel") then
|
||||
return countdown_to_halt(pos, meta, target_state_empty)
|
||||
else
|
||||
return countdown_to_halt(pos, meta, target_state_fuel)
|
||||
end
|
||||
end
|
||||
|
||||
--[[
|
||||
---------
|
||||
Callbacks
|
||||
---------
|
||||
]]--
|
||||
|
||||
-- do not allow to dig protected or non-empty machine
|
||||
local function can_dig(pos, player)
|
||||
if minetest.is_protected(pos, player:get_player_name()) then
|
||||
return false
|
||||
end
|
||||
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
|
||||
|
||||
-- init machine after placement
|
||||
local function after_place_node(pos, placer, itemstack, pointed_thing)
|
||||
local meta = minetest.get_meta(pos)
|
||||
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)
|
||||
meta:set_string("owner", placer:get_player_name())
|
||||
meta:set_int("fuel_ticks", 0)
|
||||
state_meta_reset(pos, meta)
|
||||
local number = tubelib.add_node(pos, "biogasmachines:jetfurnace")
|
||||
machine:node_init(pos, number)
|
||||
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 machine:get_state(meta) == tubelib.RUNNING) 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 machine:get_state(meta) == tubelib.RUNNING then
|
||||
return 0
|
||||
end
|
||||
end
|
||||
return stack:get_count()
|
||||
end
|
||||
|
||||
-- formspec callback
|
||||
local function on_receive_fields(pos, formname, fields, player)
|
||||
if minetest.is_protected(pos, player:get_player_name()) then
|
||||
return
|
||||
end
|
||||
machine:state_button_event(pos, fields)
|
||||
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 fuel = meta:get_int("fuel_ticks")
|
||||
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 fuel_countdown_to_halt(pos, meta,
|
||||
tubelib.STANDBY, tubelib.STOPPED)
|
||||
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
|
||||
inv:set_list("dst_copy", inv:get_list("dst"))
|
||||
local is_dst_ok = true
|
||||
for _, stack in ipairs(recipe.output) do
|
||||
local outp = inv:add_item("dst_copy", stack)
|
||||
if not outp:is_empty() then
|
||||
is_dst_ok = false
|
||||
break
|
||||
end
|
||||
end
|
||||
inv:set_size("dst_copy", 0)
|
||||
if is_dst_ok 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 == -2 then
|
||||
return fuel_countdown_to_halt(pos, meta,
|
||||
tubelib.STANDBY, tubelib.STOPPED)
|
||||
elseif idx == -1 then
|
||||
if machine:get_state(meta) == tubelib.STANDBY then
|
||||
-- adapt behaviour to other biogas machines
|
||||
-- (standby->blocked should go through running)
|
||||
machine:start(pos, meta, true)
|
||||
return false
|
||||
else
|
||||
return fuel_countdown_to_halt(pos, meta,
|
||||
tubelib.BLOCKED, tubelib.FAULT)
|
||||
end
|
||||
end
|
||||
if machine:get_state(meta) == tubelib.STANDBY or
|
||||
machine:get_state(meta) == tubelib.BLOCKED then
|
||||
-- something to do, wake up and re-entry
|
||||
machine:start(pos, meta, true)
|
||||
return false
|
||||
end
|
||||
if fuel == 0 and inv:is_empty("fuel") then
|
||||
return countdown_to_halt(pos, meta, tubelib.FAULT)
|
||||
end
|
||||
inv:set_stack("src", idx, recipe.decremented_input)
|
||||
inv:set_stack("cur", 1, recipe.input)
|
||||
recipe.time = get_fast_cooking_time(recipe.time)
|
||||
meta:set_int("item_ticks", recipe.time)
|
||||
meta:set_int("item_total", recipe.time)
|
||||
else
|
||||
-- production
|
||||
inp = inv:get_stack("cur", 1)
|
||||
if machine:get_state(meta) ~= tubelib.RUNNING or
|
||||
inp:is_empty() then
|
||||
-- exception, should not happen - oops
|
||||
machine_fault(pos, meta)
|
||||
return false
|
||||
end
|
||||
-- production tick
|
||||
if fuel == 0 and inv:is_empty("fuel") then
|
||||
return countdown_to_halt(pos, meta, tubelib.FAULT)
|
||||
end
|
||||
local itemcnt = meta:get_int("item_ticks")
|
||||
local zzz -- dummy
|
||||
if itemcnt < 0 then
|
||||
-- interrupted - cook again
|
||||
recipe.time, zzz, recipe.output = get_cooking_items(inp)
|
||||
recipe.time = get_fast_cooking_time(recipe.time)
|
||||
meta:set_int("item_total", recipe.time)
|
||||
itemcnt = recipe.time
|
||||
else
|
||||
recipe.output = nil
|
||||
end
|
||||
itemcnt = itemcnt - 1
|
||||
if itemcnt == 0 then
|
||||
if not recipe.output then
|
||||
zzz, zzz, recipe.output = get_cooking_items(inp)
|
||||
end
|
||||
for _, i in ipairs(recipe.output) do
|
||||
inv:add_item("dst", i)
|
||||
end
|
||||
inv:set_stack("cur", 1, ItemStack({}))
|
||||
state_meta_reset(pos, meta)
|
||||
-- item produced, increase aging
|
||||
machine:keep_running(pos, meta, COUNTDOWN_TICKS)
|
||||
else
|
||||
meta:set_int("item_ticks", itemcnt)
|
||||
end
|
||||
-- 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_TICKS
|
||||
else
|
||||
machine_fault(pos, meta) -- oops
|
||||
return false
|
||||
end
|
||||
end
|
||||
meta:set_int("fuel_ticks", fuel - 1)
|
||||
end
|
||||
meta:set_int("tubelib_countdown", COUNTDOWN_TICKS)
|
||||
meta:set_int("desired_state", tubelib.RUNNING)
|
||||
meta:set_string("formspec", formspec(machine, pos, meta))
|
||||
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(),
|
||||
|
||||
drop = "",
|
||||
can_dig = can_dig,
|
||||
|
||||
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
||||
machine:after_dig_node(pos, oldnode, oldmetadata, digger)
|
||||
after_dig_node(pos, oldnode, oldmetadata, digger)
|
||||
end,
|
||||
|
||||
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 = after_place_node,
|
||||
})
|
||||
|
||||
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(),
|
||||
|
||||
drop = "",
|
||||
can_dig = can_dig,
|
||||
|
||||
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
||||
machine:after_dig_node(pos, oldnode, oldmetadata, digger)
|
||||
after_dig_node(pos, oldnode, oldmetadata, digger)
|
||||
end,
|
||||
|
||||
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,
|
||||
})
|
||||
|
||||
minetest.register_node("biogasmachines:jetfurnace_defect", {
|
||||
description = "Tubelib Biogas Jet Furnace",
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"biogasmachines_jetfurnace_top.png",
|
||||
"biogasmachines_bottom.png",
|
||||
"biogasmachines_jetfurnace_side.png^tubelib_defect.png",
|
||||
"biogasmachines_jetfurnace_side.png^tubelib_defect.png",
|
||||
"biogasmachines_jetfurnace_side.png^tubelib_defect.png",
|
||||
"biogasmachines_jetfurnace_side.png^tubelib_defect.png",
|
||||
},
|
||||
drawtype = "nodebox",
|
||||
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
paramtype2 = "facedir",
|
||||
groups = { choppy = 2, cracky = 2, crumbly = 2, 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_rotate = screwdriver.disallow,
|
||||
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)
|
||||
after_place_node(pos, placer, itemstack, pointed_thing)
|
||||
machine:defect(pos, minetest.get_meta(pos))
|
||||
end,
|
||||
})
|
||||
|
||||
tubelib.register_node("biogasmachines:jetfurnace",
|
||||
{ "biogasmachines:jetfurnace_active", "biogasmachines:jetfurnace_defect" }, {
|
||||
|
||||
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 == "fuel" then
|
||||
return tubelib.fuelstate(meta, "fuel")
|
||||
end
|
||||
local resp = machine:on_receive_message(pos, topic, payload)
|
||||
if resp then
|
||||
return resp
|
||||
else
|
||||
return "unsupported"
|
||||
end
|
||||
end,
|
||||
|
||||
on_node_load = function(pos)
|
||||
machine:on_node_load(pos)
|
||||
end,
|
||||
|
||||
on_node_repair = function(pos)
|
||||
return machine:on_node_repair(pos)
|
||||
end,
|
||||
})
|
||||
|
||||
--[[
|
||||
--------
|
||||
Crafting
|
||||
--------
|
||||
]]--
|
||||
|
||||
minetest.register_craft({
|
||||
output = "biogasmachines:jetfurnace",
|
||||
recipe = {
|
||||
{ "default:obsidian_block", "biogasmachines:gasfurnace", "" },
|
||||
{ "biogasmachines:gasfurnace", "default:goldblock", "" },
|
||||
{ "", "", "" },
|
||||
},
|
||||
})
|
259
furnace/furnace_top.lua
Normal file
@ -0,0 +1,259 @@
|
||||
--[[
|
||||
|
||||
TechAge
|
||||
=======
|
||||
|
||||
Copyright (C) 2019 Joachim Stolberg
|
||||
|
||||
LGPLv2.1+
|
||||
See LICENSE.txt for more information
|
||||
|
||||
TA3 Industrial Furnace Top
|
||||
|
||||
]]--
|
||||
|
||||
-- for lazy programmers
|
||||
local S = function(pos) if pos then return minetest.pos_to_string(pos) end end
|
||||
local P = minetest.string_to_pos
|
||||
local M = minetest.get_meta
|
||||
-- Consumer Related Data
|
||||
local CRD = function(pos) return (minetest.registered_nodes[minetest.get_node(pos).name] or {}).consumer end
|
||||
|
||||
|
||||
-- Load support for intllib.
|
||||
local MP = minetest.get_modpath("techage")
|
||||
local I,_ = dofile(MP.."/intllib.lua")
|
||||
|
||||
local STANDBY_TICKS = 6
|
||||
local COUNTDOWN_TICKS = 6
|
||||
local CYCLE_TIME = 2
|
||||
|
||||
local smelting = techage.furnace.smelting
|
||||
local get_output = techage.furnace.get_output
|
||||
local num_recipes = techage.furnace.get_num_recipes
|
||||
local reset_cooking = techage.furnace.reset_cooking
|
||||
|
||||
local function formspec(self, pos, mem)
|
||||
local idx = mem.recipe_idx or 1
|
||||
local num, output = num_recipes(), get_output(idx)
|
||||
return "size[8,7.2]"..
|
||||
default.gui_bg..
|
||||
default.gui_bg_img..
|
||||
default.gui_slots..
|
||||
"list[context;src;0,0;2,2;]"..
|
||||
"image[2,0.5;1,1;techage_form_arrow.png]"..
|
||||
"image_button[2,2;1,1;".. self:get_state_button_image(mem) ..";state_button;]"..
|
||||
"list[context;dst;3,0;2,2;]"..
|
||||
|
||||
"label[6,0;"..I("Outp")..": "..idx.."/"..num.."]"..
|
||||
"item_image_button[6.5,0.5;1,1;"..output..";b1;]"..
|
||||
"button[6,1.5;1,1;priv;<<]"..
|
||||
"button[7,1.5;1,1;next;>>]"..
|
||||
|
||||
"list[current_player;main;0,3.5;8,4;]" ..
|
||||
"listring[current_player;main]"..
|
||||
"listring[context;src]" ..
|
||||
"listring[current_player;main]"..
|
||||
"listring[context;dst]" ..
|
||||
"listring[current_player;main]"..
|
||||
default.get_hotbar_bg(0, 4)
|
||||
end
|
||||
|
||||
local function on_rightclick(pos, node, clicker)
|
||||
local mem = tubelib2.get_mem(pos)
|
||||
M(pos):set_string("formspec", formspec(CRD(pos).State, pos, mem))
|
||||
end
|
||||
|
||||
local function firebox_cmnd(pos, cmnd)
|
||||
return techage.transfer(
|
||||
{x=pos.x, y=pos.y-1, z=pos.z},
|
||||
nil, -- outdir
|
||||
cmnd, -- topic
|
||||
nil, -- payload
|
||||
nil, -- network
|
||||
{"techage:furnace_firebox", "techage:furnace_firebox_on"})
|
||||
end
|
||||
|
||||
local function cooking(pos, crd, mem, elapsed)
|
||||
if firebox_cmnd(pos, "fuel") then
|
||||
local state = smelting(pos, mem, elapsed)
|
||||
--print("cooking", techage.StateStrings[state])
|
||||
if state == techage.RUNNING then
|
||||
crd.State:keep_running(pos, mem, COUNTDOWN_TICKS)
|
||||
elseif state == techage.BLOCKED then
|
||||
crd.State:blocked(pos, mem)
|
||||
elseif state == techage.STANDBY then
|
||||
crd.State:idle(pos, mem)
|
||||
end
|
||||
else
|
||||
crd.State:fault(pos, mem)
|
||||
end
|
||||
end
|
||||
|
||||
local function keep_running(pos, elapsed)
|
||||
local mem = tubelib2.get_mem(pos)
|
||||
local crd = CRD(pos)
|
||||
cooking(pos, crd, mem, elapsed)
|
||||
return crd.State:is_active(mem)
|
||||
end
|
||||
|
||||
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
|
||||
CRD(pos).State:start_if_standby(pos)
|
||||
return stack:get_count()
|
||||
elseif listname == "dst" then
|
||||
return 0
|
||||
end
|
||||
end
|
||||
|
||||
local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player)
|
||||
local meta = minetest.get_meta(pos)
|
||||
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
|
||||
|
||||
local function allow_metadata_inventory_take(pos, listname, index, stack, player)
|
||||
if minetest.is_protected(pos, player:get_player_name()) then
|
||||
return 0
|
||||
end
|
||||
return stack:get_count()
|
||||
end
|
||||
|
||||
local function on_receive_fields(pos, formname, fields, player)
|
||||
if minetest.is_protected(pos, player:get_player_name()) then
|
||||
return
|
||||
end
|
||||
local mem = tubelib2.get_mem(pos)
|
||||
mem.recipe_idx = mem.recipe_idx or 1
|
||||
if fields.next == ">>" then
|
||||
mem.recipe_idx = math.min(mem.recipe_idx + 1, num_recipes())
|
||||
M(pos):set_string("formspec", formspec(CRD(pos).State, pos, mem))
|
||||
reset_cooking(mem)
|
||||
elseif fields.priv == "<<" then
|
||||
mem.recipe_idx = math.max(mem.recipe_idx - 1, 1)
|
||||
M(pos):set_string("formspec", formspec(CRD(pos).State, pos, mem))
|
||||
reset_cooking(mem)
|
||||
end
|
||||
CRD(pos).State:state_button_event(pos, mem, fields)
|
||||
end
|
||||
|
||||
local function can_dig(pos, player)
|
||||
if minetest.is_protected(pos, player:get_player_name()) then
|
||||
return false
|
||||
end
|
||||
local inv = M(pos):get_inventory()
|
||||
return inv:is_empty("dst") and inv:is_empty("src")
|
||||
end
|
||||
|
||||
local function on_node_state_change(pos, old_state, new_state)
|
||||
if new_state == techage.RUNNING then
|
||||
firebox_cmnd(pos, "start")
|
||||
else
|
||||
firebox_cmnd(pos, "stop")
|
||||
end
|
||||
local mem = tubelib2.get_mem(pos)
|
||||
reset_cooking(mem)
|
||||
end
|
||||
|
||||
local tiles = {}
|
||||
|
||||
-- '#' will be replaced by the stage number
|
||||
tiles.pas = {
|
||||
-- up, down, right, left, back, front
|
||||
"techage_concrete.png^techage_frame_ta#_top.png",
|
||||
"techage_concrete.png^techage_frame_ta#_top.png",
|
||||
"techage_concrete.png^techage_frame_ta#.png",
|
||||
"techage_concrete.png^techage_frame_ta#.png",
|
||||
"techage_concrete.png^techage_frame_ta#.png",
|
||||
"techage_concrete.png^techage_appl_furnace.png^techage_frame_ta#.png",
|
||||
}
|
||||
tiles.act = tiles.pas
|
||||
tiles.def = {
|
||||
-- up, down, right, left, back, front
|
||||
"techage_concrete.png^techage_frame_ta#_top.png",
|
||||
"techage_concrete.png^techage_frame_ta#_top.png",
|
||||
"techage_concrete.png^techage_frame_ta#.png^techage_appl_defect.png",
|
||||
"techage_concrete.png^techage_frame_ta#.png^techage_appl_defect.png",
|
||||
"techage_concrete.png^techage_frame_ta#.png^techage_appl_defect.png",
|
||||
"techage_concrete.png^techage_appl_furnace.png^techage_frame_ta#.png^techage_appl_defect.png",
|
||||
}
|
||||
|
||||
local tubing = {
|
||||
on_pull_item = function(pos, in_dir, num)
|
||||
local meta = minetest.get_meta(pos)
|
||||
if meta:get_int("pull_dir") == in_dir then
|
||||
local inv = M(pos):get_inventory()
|
||||
return techage.get_items(inv, "dst", num)
|
||||
end
|
||||
end,
|
||||
on_push_item = function(pos, in_dir, stack)
|
||||
local meta = minetest.get_meta(pos)
|
||||
if meta:get_int("push_dir") == in_dir or in_dir == 5 then
|
||||
local inv = M(pos):get_inventory()
|
||||
return techage.put_items(inv, "src", stack)
|
||||
end
|
||||
end,
|
||||
on_unpull_item = function(pos, in_dir, stack)
|
||||
local meta = minetest.get_meta(pos)
|
||||
if meta:get_int("pull_dir") == in_dir then
|
||||
local inv = M(pos):get_inventory()
|
||||
return techage.put_items(inv, "dst", stack)
|
||||
end
|
||||
end,
|
||||
on_recv_message = function(pos, topic, payload)
|
||||
local resp = CRD(pos).State:on_receive_message(pos, topic, payload)
|
||||
if resp then
|
||||
return resp
|
||||
else
|
||||
return "unsupported"
|
||||
end
|
||||
end,
|
||||
on_node_load = function(pos)
|
||||
CRD(pos).State:on_node_load(pos)
|
||||
end,
|
||||
on_node_repair = function(pos)
|
||||
return CRD(pos).State:on_node_repair(pos)
|
||||
end,
|
||||
}
|
||||
|
||||
local _, node_name_ta3, _ =
|
||||
techage.register_consumer("furnace", I("TA3 Furnace Top"), tiles, {
|
||||
drawtype = "normal",
|
||||
cycle_time = CYCLE_TIME,
|
||||
standby_ticks = STANDBY_TICKS,
|
||||
has_item_meter = true,
|
||||
aging_factor = 10,
|
||||
formspec = formspec,
|
||||
tubing = tubing,
|
||||
on_state_change = on_node_state_change,
|
||||
after_place_node = function(pos, placer)
|
||||
local inv = M(pos):get_inventory()
|
||||
inv:set_size("src", 2*2)
|
||||
inv:set_size("dst", 2*2)
|
||||
end,
|
||||
can_dig = can_dig,
|
||||
node_timer = keep_running,
|
||||
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,
|
||||
groups = {choppy=2, cracky=2, crumbly=2},
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
num_items = {0,1,1,1},
|
||||
},
|
||||
{false, false, true, false}) -- TA3 only
|
||||
|
||||
|
||||
|
||||
minetest.register_craft({
|
||||
output = node_name_ta3,
|
||||
recipe = {
|
||||
{"", "techage:baborium_ingot", ""},
|
||||
{"", "default:furnace", ""},
|
||||
{"", "techage:vacuum_tube", ""},
|
||||
},
|
||||
})
|
56
furnace/recipes.lua
Normal file
@ -0,0 +1,56 @@
|
||||
--[[
|
||||
|
||||
TechAge
|
||||
=======
|
||||
|
||||
Copyright (C) 2019 Joachim Stolberg
|
||||
|
||||
LGPLv2.1+
|
||||
See LICENSE.txt for more information
|
||||
|
||||
Cooking recipes for furnace
|
||||
|
||||
]]--
|
||||
|
||||
|
||||
techage.furnace.register_recipe({
|
||||
output = "techage:iron_ingot",
|
||||
recipe = {"default:iron_lump"},
|
||||
time = 2,
|
||||
})
|
||||
|
||||
if techage.modified_recipes_enabled then
|
||||
techage.ironage_register_recipe({
|
||||
output = "default:bronze_ingot 4",
|
||||
recipe = {"default:copper_ingot", "default:copper_ingot", "default:copper_ingot", "default:tin_ingot"},
|
||||
time = 2,
|
||||
})
|
||||
|
||||
techage.furnace.register_recipe({
|
||||
output = "default:steel_ingot 4",
|
||||
recipe = {"default:coal_lump", "default:iron_lump", "default:iron_lump", "default:iron_lump"},
|
||||
time = 4,
|
||||
})
|
||||
end
|
||||
|
||||
|
||||
minetest.after(1, function()
|
||||
for key,_ in pairs(minetest.registered_items) do
|
||||
if key ~= "" then
|
||||
local tbl = minetest.get_all_craft_recipes(key)
|
||||
if tbl then
|
||||
for _,recipe in ipairs(tbl) do
|
||||
if recipe and recipe.method == "cooking" then
|
||||
--print(dump(idef), dump(recipe))
|
||||
--print(key, recipe.width)
|
||||
techage.furnace.register_recipe({
|
||||
output = recipe.output,
|
||||
recipe = recipe.items,
|
||||
time = math.floor((recipe.width + 1) / 2),
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
7
init.lua
@ -104,6 +104,13 @@ else
|
||||
dofile(MP.."/coal_power_station/cooler.lua")
|
||||
dofile(MP.."/coal_power_station/akkubox.lua")
|
||||
|
||||
-- Industrial Furnace
|
||||
dofile(MP.."/furnace/firebox.lua")
|
||||
dofile(MP.."/furnace/cooking.lua")
|
||||
dofile(MP.."/furnace/furnace_top.lua")
|
||||
dofile(MP.."/furnace/booster.lua")
|
||||
dofile(MP.."/furnace/recipes.lua")
|
||||
|
||||
-- Lamps
|
||||
dofile(MP.."/lamps/lib.lua")
|
||||
dofile(MP.."/lamps/simplelamp.lua")
|
||||
|
@ -122,6 +122,6 @@ function techage.register_lamp(basename, ndef_off, ndef_on)
|
||||
on_power_pass1 = on_power_pass1,
|
||||
on_power_pass2 = on_power_pass2,
|
||||
power_network = Power,
|
||||
conn_sides = determine_power_side, -- will be handled by clbk function
|
||||
conn_sides = ndef_off.conn_sides or determine_power_side, -- will be handled by clbk function
|
||||
})
|
||||
end
|
||||
|
@ -21,7 +21,7 @@ techage.register_lamp("techage:simplelamp", {
|
||||
tiles = {
|
||||
'techage_electric_button.png',
|
||||
},
|
||||
|
||||
conn_sides = {"L", "R", "U", "D", "F", "B"},
|
||||
paramtype = "light",
|
||||
light_source = 0,
|
||||
sunlight_propagates = true,
|
||||
@ -34,6 +34,7 @@ techage.register_lamp("techage:simplelamp", {
|
||||
tiles = {
|
||||
'techage_electric_button.png',
|
||||
},
|
||||
conn_sides = {"L", "R", "U", "D", "F", "B"},
|
||||
paramtype = "light",
|
||||
light_source = minetest.LIGHT_MAX,
|
||||
sunlight_propagates = true,
|
||||
|
@ -1,31 +0,0 @@
|
||||
local function formspec(self, pos, mem)
|
||||
if not mem.tower_built then
|
||||
return formspec0
|
||||
end
|
||||
local icon = "techage_oil_inv"
|
||||
local depth = "1/480"
|
||||
return "size[8,8]"..
|
||||
default.gui_bg..
|
||||
default.gui_bg_img..
|
||||
default.gui_slots..
|
||||
"list[context;src;1,1;1,1;]"..
|
||||
"label[1.3,0.5;IN]"..
|
||||
"item_image[1,1;1,1;techage:oil_drillbit]"..
|
||||
"label[1,2;"..I("Drill Bit").."]"..
|
||||
"label[0.5,3;"..I("Depth")..": "..depth.."]"..
|
||||
"image[3.5,0;1,1;"..techage.get_power_image(pos, mem).."]"..
|
||||
"image[3.5,1;1,1;techage_form_arrow.png]"..
|
||||
"image_button[3.5,2;1,1;".. self:get_state_button_image(mem) ..";state_button;]"..
|
||||
"label[6.2,0.5;OUT]"..
|
||||
"list[context;dst;6,1;1,1;]"..
|
||||
"label[6.2,2;"..I("Oil").."]"..
|
||||
"label[5.5,3;"..I("Extract")..": "..depth.."]"..
|
||||
"item_image[6,1;1,1;techage:oil_source]"..
|
||||
"button_exit[0,3.9;3,1;destroy;"..I("Destroy Tower").."]"..
|
||||
"list[current_player;main;0,4;8,4;]"..
|
||||
"listring[context;dst]"..
|
||||
"listring[current_player;main]"..
|
||||
"listring[context;src]"..
|
||||
"listring[current_player;main]"..
|
||||
default.get_hotbar_bg(0, 4)
|
||||
end
|
BIN
sounds/techage_booster.ogg
Normal file
@ -25,25 +25,6 @@ local firebox = techage.firebox
|
||||
|
||||
local CYCLE_TIME = 2
|
||||
|
||||
local function formspec(mem)
|
||||
local fuel_percent = 0
|
||||
if mem.running then
|
||||
fuel_percent = ((mem.burn_cycles or 1) * 100) / (mem.burn_cycles_total or 1)
|
||||
end
|
||||
return "size[8,6]"..
|
||||
default.gui_bg..
|
||||
default.gui_bg_img..
|
||||
default.gui_slots..
|
||||
"list[current_name;fuel;1,0.5;1,1;]"..
|
||||
"image[3,0.5;1,1;default_furnace_fire_bg.png^[lowpart:"..
|
||||
fuel_percent..":default_furnace_fire_fg.png]"..
|
||||
"button[5,0.5;1.8,1;update;"..I("Update").."]"..
|
||||
"list[current_player;main;0,2;8,4;]"..
|
||||
"listring[current_name;fuel]"..
|
||||
"listring[current_player;main]"..
|
||||
default.get_hotbar_bg(0, 2)
|
||||
end
|
||||
|
||||
local function node_timer(pos, elapsed)
|
||||
local mem = tubelib2.get_mem(pos)
|
||||
if mem.running then
|
||||
@ -64,7 +45,7 @@ local function node_timer(pos, elapsed)
|
||||
else
|
||||
mem.running = false
|
||||
firebox.swap_node(pos, "techage:firebox")
|
||||
M(pos):set_string("formspec", formspec(mem))
|
||||
M(pos):set_string("formspec", firebox.formspec(mem))
|
||||
return false
|
||||
end
|
||||
end
|
||||
@ -72,27 +53,11 @@ local function node_timer(pos, elapsed)
|
||||
end
|
||||
end
|
||||
|
||||
local function on_receive_fields(pos, formname, fields, player)
|
||||
if minetest.is_protected(pos, player:get_player_name()) then
|
||||
return
|
||||
end
|
||||
if fields.update then
|
||||
local mem = tubelib2.get_mem(pos)
|
||||
M(pos):set_string("formspec", formspec(mem))
|
||||
end
|
||||
end
|
||||
|
||||
local function on_rightclick(pos, node, clicker)
|
||||
local mem = tubelib2.get_mem(pos)
|
||||
M(pos):set_string("formspec", formspec(mem))
|
||||
end
|
||||
|
||||
|
||||
minetest.register_node("techage:firebox", {
|
||||
description = I("TA2 Firebox"),
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"techage_firebox.png^techage_frame_ta2.png",
|
||||
"techage_firebox.png^techage_appl_open.png^techage_frame_ta2.png",
|
||||
"techage_firebox.png^techage_frame_ta2.png",
|
||||
"techage_firebox.png^techage_frame_ta2.png",
|
||||
"techage_firebox.png^techage_frame_ta2.png",
|
||||
@ -109,15 +74,15 @@ minetest.register_node("techage:firebox", {
|
||||
can_dig = firebox.can_dig,
|
||||
allow_metadata_inventory_put = firebox.allow_metadata_inventory,
|
||||
allow_metadata_inventory_take = firebox.allow_metadata_inventory,
|
||||
on_receive_fields = on_receive_fields,
|
||||
on_rightclick = on_rightclick,
|
||||
on_receive_fields = firebox.on_receive_fields,
|
||||
on_rightclick = firebox.on_rightclick,
|
||||
|
||||
on_construct = function(pos)
|
||||
local mem = tubelib2.init_mem(pos)
|
||||
mem.running = false
|
||||
mem.burn_cycles = 0
|
||||
local meta = M(pos)
|
||||
meta:set_string("formspec", formspec(mem))
|
||||
meta:set_string("formspec", firebox.formspec(mem))
|
||||
local inv = meta:get_inventory()
|
||||
inv:set_size('fuel', 1)
|
||||
end,
|
||||
@ -128,7 +93,7 @@ minetest.register_node("techage:firebox", {
|
||||
-- activate the formspec fire temporarily
|
||||
mem.burn_cycles = firebox.Burntime[stack:get_name()] / CYCLE_TIME
|
||||
mem.burn_cycles_total = mem.burn_cycles
|
||||
M(pos):set_string("formspec", formspec(mem))
|
||||
M(pos):set_string("formspec", firebox.formspec(mem))
|
||||
mem.burn_cycles = 0
|
||||
firebox.swap_node(pos, "techage:firebox_on")
|
||||
minetest.get_node_timer(pos):start(CYCLE_TIME)
|
||||
@ -167,8 +132,8 @@ minetest.register_node("techage:firebox_on", {
|
||||
can_dig = firebox.can_dig,
|
||||
allow_metadata_inventory_put = firebox.allow_metadata_inventory,
|
||||
allow_metadata_inventory_take = firebox.allow_metadata_inventory,
|
||||
on_receive_fields = on_receive_fields,
|
||||
on_rightclick = on_rightclick,
|
||||
on_receive_fields = firebox.on_receive_fields,
|
||||
on_rightclick = firebox.on_rightclick,
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
@ -184,10 +149,12 @@ techage.register_node({"techage:firebox", "techage:firebox_on"}, {
|
||||
on_push_item = function(pos, in_dir, stack)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
if inv:room_for_item("fuel", stack) then
|
||||
inv:add_item("fuel", stack)
|
||||
minetest.get_node_timer(pos):start(CYCLE_TIME)
|
||||
return true
|
||||
if firebox.Burntime[stack:get_name()] then
|
||||
if inv:room_for_item("fuel", stack) then
|
||||
inv:add_item("fuel", stack)
|
||||
minetest.get_node_timer(pos):start(CYCLE_TIME)
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end,
|
||||
|
BIN
textures/techage_appl_furnace.png
Normal file
After Width: | Height: | Size: 296 B |
Before Width: | Height: | Size: 575 B After Width: | Height: | Size: 575 B |
BIN
textures/techage_concrete4.png
Normal file
After Width: | Height: | Size: 597 B |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 985 B After Width: | Height: | Size: 398 B |
Before Width: | Height: | Size: 985 B After Width: | Height: | Size: 398 B |