2024-09-15 21:01:58 -04:00

140 lines
4.0 KiB
Lua

-- LUALOCALS < ---------------------------------------------------------
local ItemStack, math, minetest, nodecore, pairs
= ItemStack, math, minetest, nodecore, pairs
local math_floor, math_random
= math.floor, math.random
-- LUALOCALS > ---------------------------------------------------------
local modname = minetest.get_current_modname()
nodecore.register_on_register_item({
retroactive = true,
func = function(_, def)
if def.groups and def.groups.lode_temper_hot
and def.groups.lode_temper_hot > 0 then
def.groups.tongs_pickup = def.groups.tongs_pickup or 1
end
end
})
local tongs_pickup = {}
minetest.after(0, function()
for k, v in pairs(minetest.registered_items) do
if v.groups and v.groups.tongs_pickup then
tongs_pickup[k] = ((v.groups.tongs_wear_add_percent or 0) + 100) / 100
end
end
end)
nodecore.register_lode("tongs", {
type = "tool",
description = "## Lode Tongs",
inventory_image = modname .. "_#.png^[mask:" .. modname .. "_tongs.png",
stack_max = 1,
light_source = 1,
tool_wears_to = modname .. ":prill_# 5",
bytemper = function(temper, def)
-- glowing tongs can't hold anything
if temper.name == "hot" then return end
-- annealed lasts ~5min, tempered lasts 3x as long
local wrate = 65536 / 300 / (temper.name == "tempered" and 3 or 1)
def.on_item_hotpotato = function(player, myslot, mystack, itemslot, itemstack, dtime)
-- only works on glowing lode things
local wearmult = tongs_pickup[itemstack:get_name()]
if not wearmult then return end
-- item must be adjacent to tongs in inventory
if myslot > itemslot + 1 or myslot < itemslot - 1 then return end
-- Apply tool wear/breakage.
local dwear = wearmult * wrate * (dtime or 3)
dwear = math_floor(dwear) + (math_random() < (dwear - math_floor(dwear))
and 1 or 0)
local oldname = mystack:get_name()
mystack:add_wear(dwear)
if mystack:get_count() < 1 then
nodecore.toolbreakeffects(player, minetest.registered_items[oldname])
mystack = ItemStack(modname .. ":prill_" .. temper.name .. " 5")
end
player:get_inventory():set_stack("main", myslot, mystack)
return true
end
end
})
nodecore.register_lode_anvil_recipe({x = 1, y = -1}, function(temper)
return {
label = "anvil making lode tongs",
action = "pummel",
toolgroups = {thumpy = 3},
indexkeys = {modname .. ":adze_" .. temper},
nodes = {
{
match = {name = modname .. ":adze_" .. temper},
replace = "air"
},
{
x = 1,
match = {name = modname .. ":adze_" .. temper},
replace = "air"
}
},
items = {{
x = 1,
name = modname .. ":tongs_" .. temper
}}
}
end)
nodecore.register_craft({
label = "recycle lode tongs",
action = "pummel",
toolgroups = {choppy = 3},
indexkeys = {modname .. ":tongs_hot"},
nodes = {
{
match = modname .. ":tongs_hot",
replace = "air"
}
},
items = {
{name = modname .. ":bar_hot", count = 2},
{name = modname .. ":rod_hot", count = 2}
}
})
local function coolto(pos, stack, tempername)
local def = minetest.registered_items[stack:get_name()]
if not def then return end
local alt = def["lode_alt_" .. tempername]
if not alt then return end
nodecore.witness(pos, "metallurgize " .. alt)
nodecore.playcookfx(pos, true, "hiss", 80, 0.2)
return ItemStack(alt .. " " .. stack:get_count())
end
nodecore.register_aism({
label = "tong-carried lode cooling",
itemnames = {"group:lode_temper_hot"},
action = function(stack, data)
-- Don't conflict with cooking ABMs already operating on stack nodes
if data.node then return end
if nodecore.quenched(data.pos) then
return coolto(data.pos, stack, "tempered")
end
local meta = stack:get_meta()
local exp = meta:get_float("annealtime") or 0
if exp > 0 and exp <= nodecore.gametime then
return coolto(data.pos, stack, "annealed")
elseif exp <= 0 then
meta:set_float("annealtime", nodecore.gametime + 60)
end
nodecore.playcookfx(data.pos, {smoke = true}, "", 2, 1)
return stack
end
})