pipeworks/mcl_furnaces.lua
Github is a non-free platform owned by Microsoft. Reasonable alternatives exist, such as Gitea, Sourcehut. We need a federated, mastodon-like forge based on ForgeFed. See: https://forgefed.org d90c17edee
MineClone smoker and blast furnace support (#85)
2023-09-06 15:33:41 +02:00

377 lines
11 KiB
Lua

local old_furnace = table.copy(minetest.registered_nodes["mcl_furnaces:furnace"])
local old_blast_furnace = table.copy(minetest.registered_nodes["mcl_blast_furnace:blast_furnace"])
local old_smoker = table.copy(minetest.registered_nodes["mcl_smoker:smoker"])
local tube_entry = "^pipeworks_tube_connection_stony.png"
-- groups
local furnace_groups = old_furnace.groups
furnace_groups["tubedevice"] = 1
furnace_groups["tubedevice_receiver"] = 1
local furnace_groups_active = table.copy(furnace_groups)
furnace_groups_active["not_in_creative_inventory"] = 1
local blast_furnace_groups = old_blast_furnace.groups
blast_furnace_groups["tubedevice"] = 1
blast_furnace_groups["tubedevice_receiver"] = 1
local blast_furnace_groups_active = table.copy(blast_furnace_groups)
blast_furnace_groups_active["not_in_creative_inventory"] = 1
local smoker_groups = old_smoker.groups
smoker_groups["tubedevice"] = 1
smoker_groups["tubedevice_receiver"] = 1
local smoker_groups_active = table.copy(smoker_groups)
smoker_groups_active["not_in_creative_inventory"] = 1
-- a hack to give the exp to fake players it's be dropped instead added to (fake) player inv
local function give_xp(pos, player)
local meta = minetest.get_meta(pos)
local dir = vector.divide(minetest.facedir_to_dir(minetest.get_node(pos).param2), -1.95)
local xp = meta:get_int("xp")
if xp > 0 then
mcl_experience.throw_xp(vector.add(pos, dir), xp)
meta:set_int("xp", 0)
end
end
local override = {}
override.tiles = {
"default_furnace_top.png"..tube_entry,
"default_furnace_bottom.png"..tube_entry,
"default_furnace_side.png"..tube_entry,
"default_furnace_side.png"..tube_entry,
"default_furnace_side.png"..tube_entry,
"default_furnace_front.png"
}
override.groups = furnace_groups
override.tube = {
insert_object = function(pos, node, stack, direction)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local timer = minetest.get_node_timer(pos)
if not timer:is_started() then
timer:start(1.0)
end
if direction.y == 1 then
return inv:add_item("fuel", stack)
else
return inv:add_item("src", stack)
end
end,
can_insert = function(pos,node,stack,direction)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
if direction.y == 1 then
return inv:room_for_item("fuel", stack)
else
if meta:get_int("split_material_stacks") == 1 then
stack = stack:peek_item(1)
end
return inv:room_for_item("src", stack)
end
end,
input_inventory = "dst",
connect_sides = {left = 1, right = 1, back = 1, bottom = 1, top = 1}
}
override.after_place_node = function(pos, placer, itemstack, pointed_thing)
pipeworks.after_place(pos, placer, itemstack, pointed_thing)
end
override.after_dig_node = function(pos, oldnode, oldmetadata, digger)
old_furnace.after_dig_node(pos, oldnode, oldmetadata, digger)
pipeworks.after_dig(pos)
end
override.on_metadata_inventory_take = function(pos, listname, index, stack, player)
if listname == "dst" then
if stack:get_name() == "mcl_core:iron_ingot" then
awards.unlock(player:get_player_name(), "mcl:acquireIron")
elseif stack:get_name() == "mcl_fishing:fish_cooked" then
awards.unlock(player:get_player_name(), "mcl:cookFish")
end
give_xp(pos, player)
end
end
override.on_rotate = pipeworks.on_rotate
local override_active = table.copy(override)
override_active.tiles = {
"default_furnace_top.png"..tube_entry,
"default_furnace_bottom.png"..tube_entry,
"default_furnace_side.png"..tube_entry,
"default_furnace_side.png"..tube_entry,
"default_furnace_side.png"..tube_entry,
"default_furnace_front_active.png",
}
override_active.groups = furnace_groups_active
override_active.tube = {
insert_object = function(pos,node,stack,direction)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local timer = minetest.get_node_timer(pos)
if not timer:is_started() then
timer:start(1.0)
end
if direction.y == 1 then
return inv:add_item("fuel", stack)
else
return inv:add_item("src", stack)
end
end,
can_insert = function(pos, node, stack, direction)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
if direction.y == 1 then
return inv:room_for_item("fuel", stack)
else
return inv:room_for_item("src", stack)
end
end,
input_inventory = "dst",
connect_sides = {left = 1, right = 1, back = 1, bottom = 1, top = 1}
}
--blast furnace
local override_blast_furnace = {}
override_blast_furnace.tiles = {
"blast_furnace_top.png"..tube_entry,
"blast_furnace_top.png"..tube_entry,
"blast_furnace_side.png"..tube_entry,
"blast_furnace_side.png"..tube_entry,
"blast_furnace_side.png"..tube_entry,
"blast_furnace_front.png"
}
override_blast_furnace.groups = blast_furnace_groups
override_blast_furnace.tube = {
insert_object = function(pos, node, stack, direction)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local timer = minetest.get_node_timer(pos)
if not timer:is_started() then
timer:start(1.0)
end
if direction.y == 1 then
return inv:add_item("fuel", stack)
else
return inv:add_item("src", stack)
end
end,
can_insert = function(pos,node,stack,direction)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
if direction.y == 1 then
return inv:room_for_item("fuel", stack)
else
if meta:get_int("split_material_stacks") == 1 then
stack = stack:peek_item(1)
end
return inv:room_for_item("src", stack)
end
end,
input_inventory = "dst",
connect_sides = {left = 1, right = 1, back = 1, bottom = 1, top = 1}
}
override_blast_furnace.after_place_node = function(pos, placer, itemstack, pointed_thing)
pipeworks.after_place(pos, placer, itemstack, pointed_thing)
end
override_blast_furnace.after_dig_node = function(pos, oldnode, oldmetadata, digger)
old_blast_furnace.after_dig_node(pos, oldnode, oldmetadata, digger)
pipeworks.after_dig(pos)
end
override_blast_furnace.on_metadata_inventory_take = function(pos, listname, index, stack, player)
-- Award smelting achievements
if listname == "dst" then
if stack:get_name() == "mcl_core:iron_ingot" then
awards.unlock(player:get_player_name(), "mcl:acquireIron")
end
give_xp(pos, player)
end
end
override_blast_furnace.on_rotate = pipeworks.on_rotate
local override_blast_active = table.copy(override)
override_blast_active.tiles = {
"blast_furnace_top.png"..tube_entry,
"blast_furnace_top.png"..tube_entry,
"blast_furnace_side.png"..tube_entry,
"blast_furnace_side.png"..tube_entry,
"blast_furnace_side.png"..tube_entry,
{
name = "blast_furnace_front_on.png",
animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 48 }
},
}
override_blast_active.groups = blast_furnace_groups_active
override_blast_active.tube = {
insert_object = function(pos,node,stack,direction)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local timer = minetest.get_node_timer(pos)
if not timer:is_started() then
timer:start(1.0)
end
if direction.y == 1 then
return inv:add_item("fuel", stack)
else
return inv:add_item("src", stack)
end
end,
can_insert = function(pos, node, stack, direction)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
if direction.y == 1 then
return inv:room_for_item("fuel", stack)
else
return inv:room_for_item("src", stack)
end
end,
input_inventory = "dst",
connect_sides = {left = 1, right = 1, back = 1, bottom = 1, top = 1}
}
-- smoker
local override_smoker = {}
override_smoker.tiles = {
"smoker_top.png"..tube_entry,
"smoker_bottom.png"..tube_entry,
"smoker_side.png"..tube_entry,
"smoker_side.png"..tube_entry,
"smoker_side.png"..tube_entry,
"smoker_front.png"
}
override_smoker.groups = smoker_groups
override_smoker.tube = {
insert_object = function(pos, node, stack, direction)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local timer = minetest.get_node_timer(pos)
if not timer:is_started() then
timer:start(1.0)
end
if direction.y == 1 then
return inv:add_item("fuel", stack)
else
return inv:add_item("src", stack)
end
end,
can_insert = function(pos,node,stack,direction)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
if direction.y == 1 then
return inv:room_for_item("fuel", stack)
else
if meta:get_int("split_material_stacks") == 1 then
stack = stack:peek_item(1)
end
return inv:room_for_item("src", stack)
end
end,
input_inventory = "dst",
connect_sides = {left = 1, right = 1, back = 1, bottom = 1, top = 1}
}
override_smoker.after_place_node = function(pos, placer, itemstack, pointed_thing)
pipeworks.after_place(pos, placer, itemstack, pointed_thing)
end
override_smoker.after_dig_node = function(pos, oldnode, oldmetadata, digger)
old_smoker.after_dig_node(pos, oldnode, oldmetadata, digger)
pipeworks.after_dig(pos)
end
override_smoker.on_metadata_inventory_take = function(pos, listname, index, stack, player)
-- Award fish achievements
if listname == "dst" then
if stack:get_name() == "mcl_fishing:fish_cooked" then
awards.unlock(player:get_player_name(), "mcl:cookFish")
end
give_xp(pos, player)
end
end
override_smoker.on_rotate = pipeworks.on_rotate
local override_smoker_active = table.copy(override)
override_smoker_active.tiles = {
"smoker_top.png"..tube_entry,
"smoker_bottom.png"..tube_entry,
"smoker_side.png"..tube_entry,
"smoker_side.png"..tube_entry,
"smoker_side.png"..tube_entry,
{
name = "smoker_front_on.png",
animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 48 }
},
}
override_smoker_active.groups = smoker_groups_active
override_smoker_active.tube = {
insert_object = function(pos,node,stack,direction)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local timer = minetest.get_node_timer(pos)
if not timer:is_started() then
timer:start(1.0)
end
if direction.y == 1 then
return inv:add_item("fuel", stack)
else
return inv:add_item("src", stack)
end
end,
can_insert = function(pos, node, stack, direction)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
if direction.y == 1 then
return inv:room_for_item("fuel", stack)
else
return inv:room_for_item("src", stack)
end
end,
input_inventory = "dst",
connect_sides = {left = 1, right = 1, back = 1, bottom = 1, top = 1}
}
-- override
minetest.override_item("mcl_furnaces:furnace", override)
minetest.override_item("mcl_furnaces:furnace_active", override_active)
minetest.override_item("mcl_blast_furnace:blast_furnace", override_blast_furnace)
minetest.override_item("mcl_blast_furnace:blast_furnace_active", override_blast_active)
minetest.override_item("mcl_smoker:smoker", override_smoker)
minetest.override_item("mcl_smoker:smoker_active", override_smoker_active)