Aaron Suen b2f78c0daa Indexing for craft checks
By restricting the recipes we check based
on the name of the central object being
checked, we can do many fewer craft
checks per item and avoid expensive
checks.
2020-06-27 12:20:35 -04:00

88 lines
2.2 KiB
Lua

-- LUALOCALS < ---------------------------------------------------------
local math, minetest, nodecore
= math, minetest, nodecore
local math_random
= math.random
-- LUALOCALS > ---------------------------------------------------------
local modname = minetest.get_current_modname()
minetest.register_node(modname .. ":humus", {
description = "Humus",
tiles = {modname .. "_humus.png"},
groups = {
dirt = 2,
crumbly = 1,
soil = 4,
grassable = 1
},
alternate_loose = {
groups = {
dirt_loose = 2,
soil = 5,
grassable = 1
}
},
crush_damage = 1,
sounds = nodecore.sounds("nc_terrain_crunchy")
})
minetest.register_node(modname .. ":peat", {
description = "Peat",
tiles = {modname .. "_humus.png^" .. modname .. "_peat.png^nc_api_loose.png"},
groups = {
falling_repose = 1,
crumbly = 1,
flammable = 1,
fire_fuel = 3,
moist = 1,
green = 1
},
crush_damage = 1,
sounds = nodecore.sounds("nc_terrain_swishy")
})
nodecore.register_craft({
label = "compress peat block",
action = "pummel",
toolgroups = {crumbly = 2},
indexkeys = {modname .. ":leaves_loose"},
nodes = {
{
match = {name = modname .. ":leaves_loose", count = 8},
replace = modname .. ":peat"
}
}
})
local compostcost = 2500
nodecore.register_soaking_abm({
label = "peat compost",
fieldname = "compost",
nodenames = {modname .. ":peat"},
neighbors = {"group:soil"},
interval = 1,
chance = 10,
limited_max = 100,
limited_alert = 1000,
soakrate = nodecore.tree_soil_rate,
soakcheck = function(data, pos)
if data.total < compostcost then return end
minetest.get_meta(pos):from_table({})
if math_random(1, 100) == 1 and nodecore.is_full_sun(
{x = pos.x, y = pos.y + 1, z = pos.z}) then
nodecore.set_loud(pos, {name = "nc_terrain:dirt_with_grass"})
return
end
nodecore.set_loud(pos, {name = modname .. ":humus"})
local found = nodecore.find_nodes_around(pos, {modname .. ":peat"})
if #found < 1 then return false end
nodecore.soaking_abm_push(nodecore.pickrand(found),
"compost", data.total - compostcost)
return false
end
})
nodecore.register_dirt_leaching(modname .. ":humus", "nc_terrain:dirt_loose", 3)