minetest-buildtest/pumps/combustion.lua

179 lines
5.7 KiB
Lua

buildtest.pumps.types.combustion = {
get_pump_active_formspec = function(heat, fuel)
local formspec =
"size[8,9]"..
--"image[2,2;1,1;default_furnace_fire_bg.png^[lowpart:"..percent..":default_furnace_fire_fg.png]"..
"list[context;fuel;2.5,2;1,1;]"..
"image[6.5,0;1,5;default_lava.png^[lowpart:"..(heat)..":default_water.png]]"..
--"image[6.5,0;1,5;default_water.png]"..
--"image[6.5,"..(5 - heat * 5 / 4)..";1,1;buildtest_maker.png]"..
"image[5.5,0;1,5;oil_oil.png^[lowpart:"..(fuel)..":oil_fuel.png]]"..
--"image[5.5,0;1,5;oil_fuel.png]"..
--"image[5.5,"..(5 - fuel * 5 / 100)..";1,1;buildtest_maker.png]"..
"list[context;heat;2.5,3;1,1;]"..
"list[context;out;3.5,3;2,2;]"..
"list[current_player;main;0,5;8,4;]"
return formspec
end,
set_pump_active_formspec = function(pos)
local meta = minetest.get_meta(pos)
local fuel_level = meta:get_int("fuel")
--local max_fuel = meta:get_int("maxfuel")
local max_fuel = 1000
local fuel = (fuel_level / max_fuel) * 100
local def = minetest.registered_items[minetest.get_node(pos).name]
--local water = def.buildtest.pump.typeId * 100 / 4
local water = meta:get_int("water")
local formspec = buildtest.pumps.types.combustion.get_pump_active_formspec(water, (fuel or 0))
meta:set_string("formspec", formspec)
end,
handleCooling = function(pos, inv)
local meta = minetest.get_meta(pos)
local def = minetest.registered_items[minetest.get_node(pos).name]
----------------------------------------------------
if minetest.get_node(pos).name=="buildtest:engine_combustion_yellow" then
--print(meta:get_int("water"))
if meta:get_int("water") > 1 then
meta:set_int("water", meta:get_int("water") - 2)
buildtest.pumps.types.combustion.set_pump_active_formspec(pos)
return false
end
end
if minetest.get_node(pos).name=="buildtest:engine_combustion_red" then
if meta:get_int("water") > 20 then
meta:set_int("water", meta:get_int("water") - 20)
buildtest.pumps.hacky_swap_node(pos, def.buildtest.pump.prev)
buildtest.pumps.types.combustion.set_pump_active_formspec(pos)
return true
end
end
------------------------------------------------------
if inv:get_stack("heat", 1):is_empty() then
return false
end
local name = inv:get_stack("heat", 1):get_name()
if name=="bucket:bucket_lava" then
if def.buildtest.pump.next~=nil then
buildtest.pumps.hacky_swap_node(pos, def.buildtest.pump.next)
inv:set_stack("heat", 1, ItemStack(nil))
inv:add_item("out", ItemStack("bucket:bucket_empty"))
return true
end
end
if name=="bucket:bucket_water" then
--if def.buildtest.pump.prev~=nil then
if meta:get_int("water") < 80 then
--buildtest.pumps.hacky_swap_node(pos, def.buildtest.pump.prev)
meta:set_int("water", meta:get_int("water") + 20)
inv:set_stack("heat", 1, ItemStack(nil))
inv:add_item("out", ItemStack("bucket:bucket_empty"))
buildtest.pumps.types.combustion.set_pump_active_formspec(pos)
return true
end
end
return false
end,
}
buildtest.pumps.register_pump("buildtest:engine_combustion", "default_steel_block.png", {
description = "Buildtest Combustion Engine",
on_construct = function(pos)
local meta = minetest.get_meta(pos)
---------------------------
local formspec = buildtest.pumps.types.combustion.get_pump_active_formspec(0, 1)
---------------------------
meta:set_string("formspec", formspec)
meta:set_int("water", 0)
---------------------------
local inv = meta:get_inventory()
inv:set_size("fuel", 1)
inv:set_size("heat", 1)
inv:set_size("out", 2*2)
buildtest.pumps.on_construct(pos)
end,
can_dig = function(pos,player)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
if not inv:is_empty("fuel") then
return false
end
return true
end,
},
{
abm = function(pos)
buildtest.pumps.send(pos)
end,
runConf = function(pos)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local isBurning = function()
local fuel_level = (meta:get_int("fuel") or 0)
if fuel_level > 20 then
fuel_level = fuel_level - 20
meta:set_int("fuel", fuel_level)
buildtest.pumps.types.combustion.set_pump_active_formspec(pos)
return true
end
return false
end
if buildtest.pumps.types.combustion.handleCooling(pos, inv)==true then
return false
end
if inv:get_stack("fuel", 1):is_empty() then
return isBurning()
end
local items = inv:get_list("fuel")
local itemName = items[1]:get_name()
if itemName ~= "bucket:bucket_lava" and itemName ~= "oil:fuel_bucket" and itemName ~= "oil:bucket_oil" then
return isBurning()
end
-- print("item: "..inv:get_stack("fuel", 1):get_name())
local fuel
local sub
fuel, sub = minetest.get_craft_result({
method="fuel",
width=1,
items = items,
})
if fuel.time <= 0 then
return isBurning()
end
--meta:set_int("maxfuel", fuel.time)
local fuel_level = (meta:get_int("fuel") or 0)
if fuel.time + fuel_level >= 1000 then
return isBurning()
end
meta:set_int("fuel", fuel.time + fuel_level)
inv:set_list("fuel", sub.items)
buildtest.pumps.types.combustion.set_pump_active_formspec(pos)
-- print("pumping")
return isBurning()
end,
canHeat = function(pos)
local meta = minetest.get_meta(pos)
if minetest.get_node(pos).name=="buildtest:engine_combustion_yellow" then
if meta:get_int("water") > 20 then
return false
end
end
return true
end,
moveCount = 99,
explodes = true,
}
)
buildtest.pumps.crafts.combustion = {
mat = "default:steel_ingot",
gear = "buildtest:gear_steel",
}