2d3b468c65
- Eggcorn cleanup. They look a little better falling out of the tree, and we don't have so many now. - Crushing damage fixes. Crushing is nuanced now, and most things don't smush you, and many do reduced damage. A few may do more. - Item stack convenience. Items landing on a stack or right- clicked onto one attempt to merge into it. - Ladders now fall (they don't connect to sides). Use the new full-scale frames for ones that don't.
137 lines
4.1 KiB
Lua
137 lines
4.1 KiB
Lua
-- LUALOCALS < ---------------------------------------------------------
|
|
local minetest, nodecore, pairs, type
|
|
= minetest, nodecore, pairs, type
|
|
-- LUALOCALS > ---------------------------------------------------------
|
|
|
|
local modname = minetest.get_current_modname()
|
|
|
|
local hotitems = {}
|
|
|
|
local function reg(shape, rawdef)
|
|
for _, temper in pairs({"Hot", "Annealed", "Tempered"}) do
|
|
local def = nodecore.underride({}, rawdef)
|
|
def = nodecore.underride(def, {
|
|
description = temper .. " Lode " .. shape,
|
|
name = (shape .. "_" .. temper):lower(),
|
|
groups = { cracky = 3 },
|
|
["metal_temper_" .. temper:lower()] = true,
|
|
metal_alt_hot = modname .. ":" .. shape:lower() .. "_hot",
|
|
metal_alt_annealed = modname .. ":" .. shape:lower() .. "_annealed",
|
|
metal_alt_tempered = modname .. ":" .. shape:lower() .. "_tempered",
|
|
})
|
|
if temper ~= "Hot" then
|
|
def.light_source = nil
|
|
else
|
|
def.groups = def.groups or {}
|
|
def.groups.falling_node = 1
|
|
def.damage_per_second = 2
|
|
end
|
|
|
|
if def.tiles then
|
|
local t = {}
|
|
for k, v in pairs(def.tiles) do
|
|
t[k] = v:gsub("#", temper:lower())
|
|
end
|
|
def.tiles = t
|
|
end
|
|
def.inventory_image = def.inventory_image and
|
|
def.inventory_image:gsub("#", temper:lower())
|
|
|
|
minetest.register_item(modname .. ":" .. def.name, def)
|
|
end
|
|
end
|
|
|
|
reg("Prill", {
|
|
type = "craft",
|
|
inventory_image = modname .. "_#.png^[mask:" .. modname .. "_mask_prill.png"
|
|
})
|
|
reg("Slab", {
|
|
type = "node",
|
|
drawtype = "nodebox",
|
|
node_box = nodecore.fixedbox(-0.5, -0.5, -0.5, 0.5, 0, 0.5),
|
|
tiles = { modname .. "_#.png" },
|
|
paramtype = "light",
|
|
light_source = 6,
|
|
crush_damage = 1
|
|
})
|
|
reg("Block", {
|
|
type = "node",
|
|
tiles = { modname .. "_#.png" },
|
|
light_source = 8,
|
|
crush_damage = 4
|
|
})
|
|
|
|
local flame = {groups = {flame = true}}
|
|
local function heated(pos)
|
|
if nodecore.quenched(pos) then return end
|
|
local f = 0
|
|
if nodecore.node_is({x = pos.x, y = pos.y - 1, z = pos.z}, flame)
|
|
then f = f + 1 end
|
|
if nodecore.node_is({x = pos.x + 1, y = pos.y, z = pos.z}, flame)
|
|
then f = f + 1 end
|
|
if nodecore.node_is({x = pos.x - 1, y = pos.y, z = pos.z}, flame)
|
|
then f = f + 1 end
|
|
if f >= 3 then return true end
|
|
if nodecore.node_is({x = pos.x, y = pos.y, z = pos.z + 1}, flame)
|
|
then f = f + 1 end
|
|
if f >= 3 then return true end
|
|
if nodecore.node_is({x = pos.x, y = pos.y, z = pos.z - 1}, flame)
|
|
then f = f + 1 end
|
|
if f >= 3 then return true end
|
|
end
|
|
|
|
local function timecounter(meta, max, check)
|
|
if not check then
|
|
meta:from_table({})
|
|
return
|
|
end
|
|
local t = (meta:get_int("time") or 0) + 1
|
|
if t >= max then return true end
|
|
meta:set_int("time", t)
|
|
end
|
|
|
|
nodecore.register_limited_abm({
|
|
label = "Lode Cobble to Prills",
|
|
interval = 1,
|
|
chance = 1,
|
|
nodenames = {modname .. ":cobble"},
|
|
neighbors = {"group:flame"},
|
|
action = function(pos, node)
|
|
local below = {x = pos.x, y = pos.y - 1, z = pos.z}
|
|
if timecounter(minetest:get_meta(pos), 30,
|
|
not nodecore.node_is(below, {walkable = true}) and heated(pos)) then
|
|
nodecore.item_eject(below, modname .. ":prill_hot 2")
|
|
minetest:get_meta(pos):from_table({})
|
|
return nodecore.set_node(pos, {name = "nc_terrain:cobble"})
|
|
end
|
|
end})
|
|
|
|
local function replacestack(pos, name, stack)
|
|
nodecore.remove_node(pos)
|
|
return nodecore.item_eject(pos, name .. " " .. stack:get_count())
|
|
end
|
|
|
|
nodecore.register_limited_abm({
|
|
label = "Lode Stack Heating/Cooling",
|
|
interval = 1,
|
|
chance = 1,
|
|
nodenames = {"group:visinv"},
|
|
action = function(pos, node)
|
|
local inv = minetest.get_meta(pos):get_inventory()
|
|
local stack = inv:get_stack("solo", 1)
|
|
if stack:is_empty() then return end
|
|
local def = minetest.registered_items[stack:get_name()]
|
|
if not def then return end
|
|
if def.metal_temper_hot then
|
|
if nodecore.quenched(pos) then
|
|
return replacestack(pos, def.metal_alt_tempered, stack)
|
|
end
|
|
if timecounter(stack:get_meta(), 120, not heated(pos)) then
|
|
return replacestack(pos, def.metal_alt_annealed, stack)
|
|
end
|
|
elseif timecounter(stack:get_meta(), 30, heated(pos)) then
|
|
return replacestack(pos, def.metal_alt_hot, stack)
|
|
end
|
|
return inv:set_stack("solo", 1, stack)
|
|
end})
|