Aaron Suen a7b84724c8 Improved smoke API, smoking torches
- Smoke API uses expandable options param instead of positional
- Separate burst qty from automatically adjusted rate
- Backward compat with old API for now
- Standardize burst of smoke puffs for crafting
- Torches emit small smoke particles at increasing rate as they
  start to wear out, to warn players holding them to light another
- Torches now emit a puff of smoke upon snuffing
2022-06-08 08:15:31 -04:00

125 lines
3.7 KiB
Lua

-- LUALOCALS < ---------------------------------------------------------
local ItemStack, minetest, nodecore, pairs
= ItemStack, minetest, nodecore, pairs
-- LUALOCALS > ---------------------------------------------------------
local modname = minetest.get_current_modname()
minetest.register_tool(modname .. ":stylus", {
description = "Stone-Tipped Stylus",
tool_wears_to = "nc_tree:stick",
inventory_image = modname .. "_tool_stylus.png",
groups = {
flammable = 2,
nc_doors_pummel_first = 1
},
tool_capabilities = nodecore.toolcaps({
scratchy = 3
}),
on_ignite = "nc_stonework:chip",
sounds = nodecore.sounds("nc_terrain_stony"),
on_stack_touchtip = function(stack, desc)
local patt = stack:get_meta():get_string("pattern")
if not patt then return desc end
for _, def in pairs(nodecore.registered_concrete_patterns) do
if patt == def.name and def.description then
return desc .. "\n" .. def.description
end
end
return desc
end
})
for _, patt in pairs(nodecore.registered_concrete_patterns) do
nodecore.translate_inform(patt.description)
end
nodecore.register_craft({
label = "assemble stylus",
normal = {y = 1},
indexkeys = {"nc_stonework:chip"},
nodes = {
{match = "nc_stonework:chip", replace = "air"},
{y = -1, match = "nc_tree:stick", replace = "air"},
},
after = function(pos)
pos.y = pos.y - 1
local item = ItemStack(modname .. ":stylus")
item:get_meta():set_string("pattern",
nodecore.pickrand(nodecore.registered_concrete_patterns).name)
return nodecore.item_eject(pos, item)
end
})
local function getdefs(node)
local def = minetest.registered_items[node.name] or {}
return def.pattern_def, def.etch_def
end
nodecore.register_craft({
label = "stylus etch",
action = "pummel",
toolgroups = {scratchy = 1},
indexkeys = {"group:concrete_etchable"},
nodes = {
{
match = {groups = {concrete_etchable = true}}
}
},
after = function(pos, data)
local pattdef, etchdef = getdefs(minetest.get_node(pos))
if not (pattdef and etchdef) then return end
local setpref = modname .. ":" .. etchdef.name .. "_"
local wield = data.wield
if (not wield) or wield:is_empty() then return end
local wieldpatt = wield:get_meta():get_string("pattern")
if wieldpatt and wieldpatt ~= "" and wieldpatt ~= pattdef.name then
nodecore.set_loud(pos, {name = setpref .. wieldpatt .. "_ply"})
return
end
local nxpatt = pattdef.next.name
nodecore.set_loud(pos, {name = setpref .. nxpatt .. "_ply"})
wield:get_meta():set_string("pattern", nxpatt)
if data.crafter then
nodecore.player_discover(data.crafter, "stylus train")
data.crafter:set_wielded_item(data.wield)
elseif data.presstoolpos then
nodecore.witness(pos, "stylus train")
nodecore.stack_set(data.presstoolpos, wield)
end
end
})
nodecore.register_soaking_abm({
label = "pliable concrete cure",
interval = 1,
nodenames = {"group:concrete_etchable"},
fieldname = "plycuring",
arealoaded = 1,
soakrate = function(pos)
if minetest.find_node_near(pos,
1, {"group:concrete_flow", "group:water"}) then
return false
end
local found = nodecore.find_nodes_around(pos, "group:igniter", 1)
return #found + 1
end,
soakcheck = function(data, pos)
if data.total < 100 then
nodecore.smokefx(pos, 1, data.rate)
return
end
local pattdef, etchdef = getdefs(minetest.get_node(pos))
if not (pattdef and etchdef) then return end
local curename = modname .. ":" .. etchdef.name .. "_" .. pattdef.name
if pattdef.blank then curename = etchdef.basename end
nodecore.smokeburst(pos)
nodecore.dynamic_shade_add(pos, 1)
nodecore.set_loud(pos, {name = curename})
nodecore.witness(pos, "cure pliant concrete")
return false
end
})