Add files via upload

This commit is contained in:
wintersknight94 2023-03-10 11:47:53 -06:00 committed by GitHub
parent 8a69ae6ddc
commit be82518f20
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 1139 additions and 0 deletions

97
carpet.lua Normal file
View File

@ -0,0 +1,97 @@
-- LUALOCALS < ---------------------------------------------------------
local minetest, nodecore, string, vector
= minetest, nodecore, string, vector
local string_gsub
= string.gsub
-- LUALOCALS > ---------------------------------------------------------
local modname = minetest.get_current_modname()
-- ================================================================== --
-- <><><><> Slice (Menger) Sponges into (Sierpinski) Carpets <><><><> --
-- ================================================================== --
minetest.register_node(modname .. ":carpet", {
description = "Carpet",
use_texture_alpha = "clip",
drawtype = "nodebox",
node_box = nodecore.fixedbox({-0.5, -15/32, -0.5, 0.5, -14/32, 0.5}),
tiles = {"nc_sponge.png"},
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
walkable = false,
floodable = false,
groups = {
snappy = 1,
flammable = 3,
fire_fuel = 3,
carpet = 1
},
air_pass = true,
sounds = nodecore.sounds("nc_terrain_swishy"),
on_place = minetest.rotate_node
})
------------------------------------------------------------------------
minetest.register_node(modname .. ":carpet_wet", {
description = "Wet Carpet",
use_texture_alpha = "clip",
drawtype = "nodebox",
node_box = nodecore.fixedbox({-0.5, -15/32, -0.5, 0.5, -14/32, 0.5}),
tiles = {"nc_sponge.png^(nc_terrain_water.png^[opacity:96)"},
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
walkable = false,
floodable = false,
groups = {
snappy = 1,
coolant = 1,
moist = 1,
carpet = 1
},
sounds = nodecore.sounds("nc_terrain_swishy"),
on_place = minetest.rotate_node
})
------------------------------------------------------------------------
-- To me it makes the most sense to get 16 carpets per sponge, but that seemed
-- a bit op, so I only made it 8 until testing shows it should be more/less.
-- It could just as well be 6, given that a cube has 6 faces, and a sierpinski carpet
-- is a 2d plane, rather than an actual carpet, but whatever.
------------------------------------------------------------------------
nodecore.register_craft({
label = "slice sponge into carpet",
action = "pummel",
indexkeys = {"nc_sponge:sponge"},
nodes = {
{match = "nc_sponge:sponge", replace = "air"}
},
items = {
{name = modname.. ":carpet", count = 8, scatter = 4},
},
toolgroups = {choppy = 3},
itemscatter = 4
})
nodecore.register_craft({
label = "slice wet sponge into wet carpet",
action = "pummel",
indexkeys = {"nc_sponge:sponge_wet"},
nodes = {
{match = "nc_sponge:sponge_wet", replace = "air"}
},
items = {
{name = modname.. ":carpet_wet", count = 8, scatter = 4},
},
toolgroups = {choppy = 3},
itemscatter = 4
})
------------------------------------------------------------------------
nodecore.register_craft({
label = "compress carpets back to sponges",
action = "pummel",
toolgroups = {thumpy = 1},
indexkeys = {modname .. ":carpet"},
nodes = {
{
match = {name = modname .. ":carpet", count = 8},
replace = "nc_sponge:sponge"
}
}
})

67
glowstone.lua Normal file
View File

@ -0,0 +1,67 @@
-- LUALOCALS < ---------------------------------------------------------
local minetest, nodecore
= minetest, nodecore
-- LUALOCALS > ---------------------------------------------------------
local modname = minetest.get_current_modname()
------------------------------------------------------------------------
minetest.register_ore({
name = "nc_lux:cobble",
ore_type = "scatter",
ore = "nc_lux:cobble1",
wherein = "nc_terrain:stone",
random_factor = 0,
noise_params = {
offset = 0,
scale = 3,
spread = {x = 32, y = 12, z = 32},
seed = 782917,
octaves = 3,
persist = 0.5,
flags = "eased",
},
noise_threshold = 1.2,
y_max = -40,
y_min = -31000,
clust_num_ores = 1,
clust_size = 1,
clust_scarcity = 16 * 16 * 16 * 8
})
------------------------------------------------------------------------
-- Doesn't make sense to find partially dug ore buried in solid stone
-- so only caves are worth searching as it must be exposed to air
------------------------------------------------------------------------
local c_lux = minetest.get_content_id("nc_lux:cobble1")
local c_glowstone = minetest.get_content_id("nc_terrain:stone")
local c_air = minetest.get_content_id("air")
nodecore.register_mapgen_shared({
label = "lux cobble exposure",
func = function(minp, maxp, area, data)
local ai = area.index
for z = minp.z, maxp.z do
for y = minp.y, maxp.y do
local offs = ai(area, 0, y, z)
for x = minp.x, maxp.x do
local i = offs + x
if data[i] == c_lux then
if x == minp.x
or x == maxp.x
or y == minp.y
or y == maxp.y
or z == minp.z
or z == maxp.z
or (data[i - 1] ~= c_air
and data[i + 1] ~= c_air
and data[i - area.ystride] ~= c_air
and data[i + area.ystride] ~= c_air
and data[i - area.zstride] ~= c_air
and data[i + area.zstride] ~= c_air)
then data[i] = c_glowstone
end
end
end
end
end
end
})

37
hardbricks.lua Normal file
View File

@ -0,0 +1,37 @@
-- LUALOCALS < ---------------------------------------------------------
local ipairs, minetest, nodecore, pairs, type, math
= ipairs, minetest, nodecore, pairs, type, math
-- LUALOCALS > ---------------------------------------------------------
local modname = minetest.get_current_modname()
------------------------------------------------------------------------
for i = 1, 7 do
local o = (120 + (i * 20))
------------------------------------------------------------------------
local stonetile = nodecore.hard_stone_tile(i)
local bricktile = "nc_stonework_bricks.png^[opacity:" ..o
------------------------------------------------------------------------
minetest.register_node(modname.. ":bricks_hard_stone_" ..i.. "_bonded", {
description = "Stone Bricks",
tiles = {"(" ..stonetile.. ")^(" ..bricktile.. ")"},
groups = {
stone = i + 1,
rock = i,
cracky = i + 2,
stone_bricks = i + 2,
hard_stone = i,
hard_bricks = i
},
silktouch = false,
crush_damage = 4,
sounds = nodecore.sounds("nc_terrain_stony"),
drop_in_place = modname .. ((i > 1)
and (":bricks_hard_stone_" .. (i - 1) .. "_bonded") or ":bricks_stone_bonded"),
})
end
------------------------------------------------------------------------
minetest.register_alias(modname .. ":bricks_stone_bonded", "nc_stonework:bricks_stone_bonded")
------------------------------------------------------------------------
-- Here's the node registry, Warr. Idk how to deal with your stone hardening abm.
-- I had my own simplified version but it wasn't consistent with vanilla stone hardening.
-- On top of that, my version caused abm bogging for some reason. Major fps drop.
-- I'm certain that you can do it both better and easier than I can.

41
init.lua Normal file
View File

@ -0,0 +1,41 @@
-- LUALOCALS < ---------------------------------------------------------
local include, minetest, nodecore
= include, minetest, nodecore
-- LUALOCALS > ---------------------------------------------------------
local modname = minetest.get_current_modname()
-- ================================================================== --
include("popeggcorn")
------------------------------------------------------------------------
include("carpet")
if minetest.settings:get_bool(modname .. ".sierpinski", true) then
include("sierpinski")
end
------------------------------------------------------------------------
if minetest.settings:get_bool(modname .. ".syrup", true) then
include("syrup")
else include("treesap")
end
include("torch")
------------------------------------------------------------------------
include("lodestone")
include("glowstone")
------------------------------------------------------------------------
include("moredoor")
------------------------------------------------------------------------
include("hardbricks")
------------------------------------------------------------------------
include("reinforced")

67
lodestone.lua Normal file
View File

@ -0,0 +1,67 @@
-- LUALOCALS < ---------------------------------------------------------
local minetest, nodecore
= minetest, nodecore
-- LUALOCALS > ---------------------------------------------------------
local modname = minetest.get_current_modname()
------------------------------------------------------------------------
minetest.register_ore({
name = "nc_lode:cobble",
ore_type = "scatter",
ore = "nc_lode:cobble",
wherein = "nc_lode:stone",
random_factor = 0,
noise_params = {
offset = 0,
scale = 4,
spread = {x = 32, y = 12, z = 32},
seed = 23565,
octaves = 3,
persist = 0.5,
flags = "eased",
},
noise_threshold = 0.5,
y_max = 600,
y_min = -600,
clust_num_ores = 1,
clust_size = 1,
clust_scarcity = 8 * 8 * 8 * 4
})
------------------------------------------------------------------------
-- Doesn't make sense to find partially dug ore buried in solid stone
-- so only caves are worth searching as it must be exposed to air
------------------------------------------------------------------------
local c_lode = minetest.get_content_id("nc_lode:cobble")
local c_lodestone = minetest.get_content_id("nc_lode:stone")
local c_air = minetest.get_content_id("air")
nodecore.register_mapgen_shared({
label = "lode cobble exposure",
func = function(minp, maxp, area, data)
local ai = area.index
for z = minp.z, maxp.z do
for y = minp.y, maxp.y do
local offs = ai(area, 0, y, z)
for x = minp.x, maxp.x do
local i = offs + x
if data[i] == c_lode then
if x == minp.x
or x == maxp.x
or y == minp.y
or y == maxp.y
or z == minp.z
or z == maxp.z
or (data[i - 1] ~= c_air
and data[i + 1] ~= c_air
and data[i - area.ystride] ~= c_air
and data[i + area.ystride] ~= c_air
and data[i - area.zstride] ~= c_air
and data[i + area.zstride] ~= c_air)
then data[i] = c_lodestone
end
end
end
end
end
end
})

7
mod.conf Normal file
View File

@ -0,0 +1,7 @@
depends = nc_api_all, nc_items, nc_terrain, nc_tree, nc_woodwork, nc_sponge, nc_optics, nc_flora, nc_optics, nc_lux, nc_lode
optional_depends = wc_vulcan --to prevent strange conflict
author = Winter94
description = Ask and Ye Shall Recieve (Multiple Small Additions Requested in NC Documentation )
name = wc_noditions
title = NodeCore Additional Content

154
moredoor.lua Normal file
View File

@ -0,0 +1,154 @@
-- LUALOCALS < ---------------------------------------------------------
local ItemStack, minetest, nodecore, pairs, vector
= ItemStack, minetest, nodecore, pairs, vector
-- LUALOCALS > ---------------------------------------------------------
local modname = minetest.get_current_modname()
-- ================================================================== --
-- <> One Does Not Simply Walk Into Moredoor <> --
-- ================================================================== --
local function doorop(pos, node, clicker, _, pointed)
if nodecore.protection_test(pos, clicker) then return end
if (not pointed.above) or (not pointed.under) then return end
local force = vector.subtract(pointed.under, pointed.above)
nodecore.operate_door(pos, node, force)
end
local tilemods = {
{idx = 1, part = "end", tran = "R180"},
{idx = 2, part = "end", tran = "FX"},
{idx = 3, part = "side", tran = "I"},
{idx = 6, part = "side", tran = "R180"}
}
function nodecore.register_door(basemod, basenode, desc, pin, lv, basedef)
local basefull = basemod .. ":" .. basenode
basedef = basedef or minetest.registered_nodes[basefull]
local tiles = nodecore.underride({}, basedef.tiles)
while #tiles < 6 do tiles[#tiles + 1] = tiles[#tiles] end
for k, v in pairs(tiles) do tiles[k] = v.name or v end
for _, v in pairs(tilemods) do
tiles[v.idx] = tiles[v.idx] .. "^nc_doors_hinge_" .. v.part
.. "_base.png^[transform" .. v.tran
end
local scuff = "^(nc_doors_hinge_scuff.png^[opacity:"
.. (basedef.groups.nc_door_scuff_opacity or 64)
tiles[4] = tiles[4] .. scuff .. ")"
tiles[5] = tiles[5] .. scuff .. "^[transformR180)"
local spin = nodecore.node_spin_filtered(function(a, b)
return vector.equals(a.f, b.r)
and vector.equals(a.r, b.f)
end)
local doorname = modname .. ":door_" .. basenode
local groups = nodecore.underride({door_panel = lv}, basedef.groups)
local paneldef = nodecore.underride({}, {
name = modname .. ":panel_" .. basenode,
description = (desc or basedef.description) .. " Panel",
tiles = tiles,
paramtype2 = "facedir",
silktouch = false,
groups = groups,
on_rightclick = function(pos, node, clicker, stack, pointed, ...)
if nodecore.protection_test(pos, clicker) then return end
stack = stack and ItemStack(stack)
if (not stack) or (stack:get_name() ~= pin) then
return spin(pos, node, clicker, stack, pointed, ...)
end
local fd = node and node.param2 or 0
fd = nodecore.facedirs[fd]
local dir = vector.subtract(pointed.above, pointed.under)
if vector.equals(dir, fd.t) or vector.equals(dir, fd.b) then
node.name = doorname
nodecore.player_discover(clicker, "craft:door pin "
.. basenode:lower())
nodecore.set_loud(pos, node)
stack:take_item(1)
return stack
end
end
}, basedef)
paneldef.drop = nil
paneldef.alternate_loose = nil
paneldef.drop_in_place = nil
paneldef.after_dig_node = nil
minetest.register_node(":" .. paneldef.name, paneldef)
local t = minetest.registered_items[pin].tiles
t = t[3] or t[2] or t[1]
t = t.name or t
tiles = nodecore.underride({}, tiles)
for _, v in pairs(tilemods) do
tiles[v.idx] = tiles[v.idx] .. "^((" .. t .. ")^[mask:nc_doors_hinge_" .. v.part
.. "_mask.png^[transform" .. v.tran .. ")"
end
groups = nodecore.underride({door = lv}, basedef.groups)
local doordef = nodecore.underride({
name = doorname,
description = (desc or basedef.description) .. " Hinged Panel",
tiles = tiles,
drop = pin,
drop_in_place = paneldef.name,
on_rightclick = doorop,
groups = groups
}, paneldef)
minetest.register_node(":" .. doordef.name, doordef)
nodecore.register_craft({
label = "drill door " .. basenode:lower(),
action = "pummel",
toolgroups = {thumpy = 3},
normal = {y = 1},
indexkeys = {"group:chisel"},
nodes = {
{
match = {
lode_temper_tempered = true,
groups = {chisel = 2}
},
dig = true
},
{
y = -1,
match = basefull,
replace = paneldef.name
}
}
})
end
-- ================================================================== --
-- <> One Does Not Simply Walk Into Moredoor <> --
-- ================================================================== --
nodecore.register_door(modname, "cornplank", "Popped", "nc_woodwork:staff", 1)
nodecore.register_door("nc_flora", "thatch", "Rattan", "nc_woodwork:staff", 1)
--nodecore.register_door("nc_flora", "wicker", "Wicker", "nc_woodwork:staff", 1)
--nodecore.register_door("nc_optics", "glass", "Glass", "nc_lode:rod_tempered", 3)
--nodecore.register_door("nc_optics", "glass_float", "Clear", "nc_lode:rod_tempered", 3)
nodecore.register_door("nc_optics", "glass_opaque", "Chromatic", "nc_lode:rod_tempered", 3)
nodecore.register_door("nc_lode", "block_annealed", "Lode", "nc_lode:rod_tempered", 5)
-- ================================================================== --
-- <> One Does Not Simply Walk Into Moredoor <> -- Never gets old --
-- ================================================================== --
-- I see what the problem with adding allfaces and allfaces_optional doortypes is now.
-- Even the overrides with alpha blending seem broken due to MT rendering issues.
--minetest.override_item(modname.. ":panel_wicker",{drawtype = "normal", use_texture_alpha = true,})
--minetest.override_item(modname.. ":door_wicker",{drawtype = "normal", use_texture_alpha = true,})
--minetest.override_item(modname.. ":panel_glass",{drawtype = "normal", use_texture_alpha = true,})
--minetest.override_item(modname.. ":door_glass",{drawtype = "normal", use_texture_alpha = true,})
--minetest.override_item(modname.. ":panel_glass_float",{drawtype = "normal", use_texture_alpha = true,})
--minetest.override_item(modname.. ":door_glass_float",{drawtype = "normal", use_texture_alpha = true,})

48
popeggcorn.lua Normal file
View File

@ -0,0 +1,48 @@
-- LUALOCALS < ---------------------------------------------------------
local minetest, nodecore, pairs, vector
= minetest, nodecore, pairs, vector
-- LUALOCALS > ---------------------------------------------------------
local modname = minetest.get_current_modname()
local popcorn = "nc_woodwork_plank.png^(nc_fire_ash.png^[mask:nc_concrete_mask.png)"
-- ================================================================== --
-- I don't even like popcorn ya'll, it hurts my teeth! -- Wintersknight94
-- ================================================================== --
minetest.register_node(modname .. ":cornplank", {
description = "Popeggcorn",
tiles = {popcorn},
groups = {
choppy = 1,
flammable = 2, -- be careful, as you can easily burn your popeggcorn after it pops!
fire_fuel = 2,
falling_node = 1
},
sounds = nodecore.sounds("nc_tree_corny"),
visinv_bulk_optimize = true
})
------------------------------------------------------------------------
-- This allows eggcorns to be used in a cook recipe while still allowing you to 'burn the popcorn'
minetest.override_item("nc_tree:eggcorn",
{groups = {flammable = 20}}
)
------------------------------------------------------------------------
local function findheat(pos)
return nodecore.find_nodes_around(pos, "group:damage_radiant")
end
-- gentle application of heat is important --
nodecore.register_aism({
label = "pop eggcorns",
interval = 4,
chance = 4,
arealoaded = 1,
itemnames = {"nc_tree:eggcorn"},
action = function(stack, data)
if #findheat(data.pos) > 1 then
nodecore.sound_play("nc_api_craft_hiss", {gain = 0.02, pos = data.pos})
local taken = stack:take_item(1)
taken:set_name(modname .. ":cornplank")
if data.inv then taken = data.inv:add_item("main", taken) end
if not taken:is_empty() then nodecore.item_eject(data.pos, taken) end
return stack
end
end
})

81
reinforced.lua Normal file
View File

@ -0,0 +1,81 @@
-- LUALOCALS < ---------------------------------------------------------
local minetest, nodecore, pairs, vector
= minetest, nodecore, pairs, vector
-- LUALOCALS > ---------------------------------------------------------
local modname = minetest.get_current_modname()
------------------------------------------------------------------------
local glare = "nc_optics_glass_glare.png"
local edges = "nc_optics_glass_edges.png"
local clear = glare.. "^" ..edges
local alode = "nc_lode_annealed.png"
local tlode = "nc_lode_tempered.png"
local lmesh = alode.. "^[mask:nc_concrete_pattern_hashy.png"
local frame = alode.. "^[mask:nc_api_storebox_frame.png"
------------------------------------------------------------------------
local rglass = glare.. "^" ..lmesh
local rgedge = frame.. "^" ..edges
------------------------------------------------------------------------
local src = "nc_optics:glass_hot_source"
local flow = "nc_optics:glass_hot_flowing"
------------------------------------------------------------------------
local function near(pos, crit)
return #nodecore.find_nodes_around(pos, crit, {1, 1, 1}, {1, 0, 1}) > 0
end
-- ================================================================== --
minetest.register_node(modname .. ":glass_hard", {
description = "Reinforced Glass",
drawtype = "glasslike_framed",
tiles = {
"(" ..rglass.. ")^(" ..rgedge.. ")",
rglass
},
groups = {
silica = 1,
silica_reinforced = 1,
cracky = 4,
lux_absorb = 20,
scaling_time = 300
},
sunlight_propagates = true,
paramtype = "light",
sounds = nodecore.sounds("nc_optics_glassy")
})
-- ================================================================== --
nodecore.register_craft({
label = "cool reinforced glass",
action = "cook",
duration = 120,
touchgroups = {flame = 0},
neargroups = {coolant = 0},
cookfx = {smoke = true, hiss = true},
check = function(pos)
return not near(pos, {flow})
end,
indexkeys = {src},
nodes = {
{
match = src,
replace = "air"
},
{
y = -1,
match = "nc_lode:frame_annealed",
replace = modname .. ":glass_hard"
}
}
})
-- ================================================================== --
nodecore.register_craft({
label = "hammer reinforced glass to crude",
action = "pummel",
priority = -1,
toolgroups = {thumpy = 5},
nodes = {
{
match = {groups = {silica_reinforced = true, visinv = false}},
replace = "nc_lode:form"
}
},
items = {"nc_optics:glass_crude"}
})
-- ================================================================== --

5
settingtypes.txt Normal file
View File

@ -0,0 +1,5 @@
# If enabled, stumps exude 'syrup', which then solidifies to lumps of sap. Otherwise stumps simply exude the lumps of sap.
wc_noditions.syrup (Use Syrup Method) bool true
# If enabled, carpets behave like non-living sponges in almost every way.
wc_noditions.sierpinski (Carpets Behave Like Sponges) bool true

131
sierpinski.lua Normal file
View File

@ -0,0 +1,131 @@
-- LUALOCALS < ---------------------------------------------------------
local minetest, nodecore, pairs, vector
= minetest, nodecore, pairs, vector
-- LUALOCALS > ---------------------------------------------------------
local modname = minetest.get_current_modname()
------------------------------------------------------------------------
local carpetdirs = {
{x = 1, y = 0, z = 0},
{x = -1, y = 0, z = 0},
{x = 0, y = 0, z = 1},
{x = 0, y = 0, z = -1}
}
local carpetwet = modname .. ":carpet_wet"
------------------------------------------------------------------------
local function findwater(pos)
return nodecore.find_nodes_around(pos, "group:water")
end
local function soakup(pos)
local any
for _, p in pairs(findwater(pos)) do
nodecore.node_sound(p, "dig")
minetest.remove_node(p)
any = true
end
return any
end
------------------------------------------------------------------------
minetest.register_abm({
label = "carpet wet",
interval = 1,
chance = 10,
nodenames = {modname .. ":carpet"},
neighbors = {"group:water"},
action = function(pos)
if soakup(pos) then
nodecore.set_loud(pos, {name = modname .. ":carpet_wet"})
return nodecore.fallcheck(pos)
end
end
})
nodecore.register_aism({
label = "carpet stack wet",
interval = 1,
chance = 10,
itemnames = {modname .. ":carpet"},
action = function(stack, data)
if data.pos and soakup(data.pos) then
local taken = stack:take_item(1)
taken:set_name(modname .. ":carpet_wet")
if data.inv then taken = data.inv:add_item("main", taken) end
if not taken:is_empty() then nodecore.item_eject(data.pos, taken) end
return stack
end
end
})
minetest.register_abm({
label = "carpet sun dry",
interval = 1,
chance = 100,
nodenames = {modname .. ":carpet_wet"},
arealoaded = 1,
action = function(pos)
local above = {x = pos.x, y = pos.y + 1, z = pos.z}
if nodecore.is_full_sun(above) and #findwater(pos) < 1 then
nodecore.sound_play("nc_api_craft_hiss", {gain = 0.02, pos = pos})
return minetest.set_node(pos, {name = modname .. ":carpet"})
end
end
})
nodecore.register_aism({
label = "carpet stack sun dry",
interval = 1,
chance = 100,
arealoaded = 1,
itemnames = {modname .. ":carpet_wet"},
action = function(stack, data)
if data.player and (data.list ~= "main"
or data.slot ~= data.player:get_wield_index()) then return end
if data.pos and nodecore.is_full_sun(data.pos)
and #findwater(data.pos) < 1 then
nodecore.sound_play("nc_api_craft_hiss", {gain = 0.02, pos = data.pos})
local taken = stack:take_item(1)
taken:set_name(modname .. ":carpet")
if data.inv then taken = data.inv:add_item("main", taken) end
if not taken:is_empty() then nodecore.item_eject(data.pos, taken) end
return stack
end
end
})
minetest.register_abm({
label = "carpet fire dry",
interval = 1,
chance = 20,
nodenames = {modname .. ":carpet_wet"},
neighbors = {"group:igniter"},
action = function(pos)
nodecore.sound_play("nc_api_craft_hiss", {gain = 0.02, pos = pos})
return minetest.set_node(pos, {name = modname .. ":carpet"})
end
})
------------------------------------------------------------------------
nodecore.register_craft({
label = "squeeze carpet",
action = "pummel",
toolgroups = {thumpy = 1},
indexkeys = {carpetwet},
nodes = {
{
match = carpetwet
}
},
after = function(pos)
local found
for _, d in pairs(carpetdirs) do
local p = vector.add(pos, d)
if nodecore.artificial_water(p, {
matchpos = pos,
match = spongewet,
minttl = 1,
maxttl = 10
}) then found = true end
end
if found then nodecore.node_sound(pos, "dig") end
end
})

111
syrup.lua Normal file
View File

@ -0,0 +1,111 @@
-- LUALOCALS < ---------------------------------------------------------
local math, minetest, nodecore, pairs, string, type
= math, minetest, nodecore, pairs, string, type
local math_random
= math.random
local string_sub
= string.sub
-- LUALOCALS > ---------------------------------------------------------
local modname = minetest.get_current_modname()
local saptxr = modname.. "_sap.png"
local sapball = modname .. ":lump_sap"
local sapflam = 60 -- Seems ok for now, will likely adjust after researching chemical properties of various tree saps.
local suff = "_glued"
-- ================================================================== --
minetest.register_craftitem(sapball, {
description = "Resin", --"Sap Lump",
inventory_image = saptxr.. "^[mask:nc_fire_lump.png",
groups = {
sap = 1,
flammable = sapflam
},
sounds = nodecore.sounds("nc_terrain_crunchy")
})
------------------------------------------------------------------------
minetest.register_node(modname .. ":root_dry",
nodecore.underride({
tiles = {
"nc_tree_tree_top.png^[colorize:tan:25",
"nc_terrain_dirt.png",
"nc_terrain_dirt.png^(nc_tree_roots.png^[colorize:tan:25)"
}
}, minetest.registered_items["nc_tree:root"])
)
------------------------------------------------------------------------
local sapdef = {
description = "Syrup",
drawtype = "liquid",
tiles = {saptxr},
special_tiles = {saptxr, saptxr},
use_texture_alpha = "blend",
paramtype = "light",
liquid_viscosity = 20,
liquid_renewable = false,
liquid_range = 1,
walkable = false,
buildable_to = false,
drowning = 6,
drop = "",
groups = {
syrup = 1,
flammable = sapflam,
concrete_wet = 1, -- A humorous afterthought, bonding bricks with syrup/sap
},
post_effect_color = {a = 225, r = 80, g = 60, b = 20},
liquid_alternative_flowing = modname .. ":syrup_flowing",
liquid_alternative_source = modname .. ":syrup_source",
sounds = nodecore.sounds("nc_terrain_crunchy")
}
minetest.register_node(modname .. ":syrup_source",
nodecore.underride({
liquidtype = "source"
}, sapdef))
minetest.register_node(modname .. ":syrup_flowing",
nodecore.underride({
liquidtype = "flowing",
drawtype = "flowingliquid",
paramtype2 = "flowingliquid"
}, sapdef))
-- ================================================================== --
minetest.register_abm({ -- soaking abm or dnt might be better
label = "syrup exuding",
interval = 12,
chance = 10,
nodenames = {"nc_tree:root"},
action = function(pos, node)
local above = {x = pos.x, y = pos.y + 1, z = pos.z}
local above_node = minetest.get_node(above)
if above_node.name == "air" then
minetest.set_node(pos, {name = modname.. ":root_dry"})
nodecore.item_eject(above, {name = modname .. ":syrup_source"})
end
end
})
-- ================================================================== --
minetest.register_abm({ -- might need to make this a dnt when i learn how dnts work
label = "syrup congealing",
interval = 120,
chance = 2,
nodenames = {"group:syrup"},
action = function(pos, node)
minetest.set_node(pos, {name = "air"})
if math_random(1, 2) == 1 then return end
nodecore.item_eject(pos, {name = sapball})
end
})
-- ================================================================== --
nodecore.register_craft({
label = "glue optic",
action = "pummel",
wield = {name = sapball},
consumewield = 1,
indexkeys = "group:optic_gluable",
duration = 2,
nodes = {{
match = {groups = {optic_gluable = true}}, stacked = false
}},
after = function(pos, data)
data.node.name = data.node.name .. suff
return minetest.swap_node(pos, data.node)
end
})

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 B

228
torch.lua Normal file
View File

@ -0,0 +1,228 @@
-- LUALOCALS < ---------------------------------------------------------
local minetest, nodecore, math, string, tonumber, pairs, vector
= minetest, nodecore, math, string, tonumber, pairs, vector
local math_ceil, math_log, math_random, string_sub
= math.ceil, math.log, math.random, string.sub
-- LUALOCALS > ---------------------------------------------------------
local modname = minetest.get_current_modname()
local checkdirs = {
{x = 1, y = 0, z = 0},
{x = -1, y = 0, z = 0},
{x = 0, y = 0, z = 1},
{x = 0, y = 0, z = -1},
{x = 0, y = 1, z = 0}
}
----------------------------------------------------------------------
nodecore.saptorch_life_base = 600 -- 5x longer than regular torch
function nodecore.get_saptorch_expire(meta, name)
local expire = meta:get_float("expire") or 0
if expire > 0 then return expire end
local ttl = nodecore.saptorch_life_base
* (nodecore.boxmuller() * 0.1 + 1)
if name then
local id = tonumber(string_sub(name, -1))
if id and id > 1 then
ttl = ttl * 0.5 ^ (id - 1)
end
end
expire = nodecore.gametime + ttl
meta:set_float("expire", expire)
return expire, true
end
----------------------------------------------------------------------
local resin = "nc_fire_coal_4.png^(" ..modname.. "_sap.png^[opacity:100)"
minetest.register_alias(modname .. ":saptorch_lit", modname .. ":saptorch_lit_1")
-- ================================================================ --
minetest.register_node(modname .. ":saptorch", {
description = "Resinated Torch",
drawtype = "mesh",
mesh = "nc_torch_torch.obj",
tiles = {
resin,
"nc_tree_tree_top.png",
resin.. "^[lowpart:50:nc_tree_tree_side.png",
"[combine:1x1"
},
backface_culling = true,
use_texture_alpha = "clip",
selection_box = nodecore.fixedbox(-1/8, -0.5, -1/8, 1/8, 0.5, 1/8),
collision_box = nodecore.fixedbox(-1/16, -0.5, -1/16, 1/16, 0.5, 1/16),
paramtype = "light",
sunlight_propagates = true,
groups = {
snappy = 1,
falling_node = 1,
flammable = 1,
firestick = 4,
stack_as_node = 1
},
sounds = nodecore.sounds("nc_tree_sticky"),
on_ignite = function(pos, node)
minetest.set_node(pos, {name = modname.. ":saptorch_lit"})
nodecore.get_saptorch_expire(minetest.get_meta(pos))
nodecore.sound_play("nc_fire_ignite", {gain = 1, pos = pos})
if node and node.count and node.count > 1 then
nodecore.item_disperse(pos, node.name, node.count - 1)
end
return true
end
})
nodecore.register_craft({
label = "assemble saptorch",
normal = {y = 1},
indexkeys = {modname.. ":lump_sap"},
nodes = {
{match = modname.. ":lump_sap", replace = "air"},
{y = -1, match = "nc_torch:torch", replace = modname .. ":saptorch"},
}
})
----------------------------------------------------------------------
nodecore.saptorch_life_stages = 4
for i = 1, nodecore.saptorch_life_stages do
local alpha = (i - 1) * (256 / nodecore.saptorch_life_stages)
if alpha > 255 then alpha = 255 end
local txr = resin.. "^nc_fire_ember_4.png^(nc_fire_ash.png^[opacity:"
.. alpha .. ")"
minetest.register_node(modname .. ":saptorch_lit_" .. i, {
description = "Lit Resinated Torch",
drawtype = "mesh",
mesh = "nc_torch_torch.obj",
tiles = {
txr,
"nc_tree_tree_top.png",
txr .. "^[lowpart:50:nc_tree_tree_side.png",
{
name = "nc_torch_flame.png",
animation = {
["type"] = "vertical_frames",
aspect_w = 3,
aspect_h = 8,
length = 0.6
}
}
},
backface_culling = true,
use_texture_alpha = "clip",
selection_box = nodecore.fixedbox(-1/8, -0.5, -1/8, 1/8, 0.5, 1/8),
collision_box = nodecore.fixedbox(-1/16, -0.5, -1/16, 1/16, 0.5, 1/16),
paramtype = "light",
sunlight_propagates = true,
light_source = 10 - i,
groups = {
snappy = 1,
falling_node = 1,
stack_as_node = 1,
saptorch_lit = 1,
flame_ambiance = 1
},
stack_max = 1,
sounds = nodecore.sounds("nc_tree_sticky"),
preserve_metadata = function(_, _, oldmeta, drops)
drops[1]:get_meta():from_table({fields = oldmeta})
end,
after_place_node = function(pos, _, itemstack)
minetest.get_meta(pos):from_table(itemstack:get_meta():to_table())
end,
node_dig_prediction = nodecore.dynamic_light_node(16 - i),
after_destruct = function(pos)
nodecore.dynamic_light_add(pos, 16 - i)
end
})
end
------------------------------------------------------------------------
minetest.register_abm({
label = "saptorch ignite",
interval = 2,
chance = 1,
nodenames = {"group:saptorch_lit"},
neighbors = {"group:flammable"},
action_delay = true,
action = function(pos)
for _, ofst in pairs(checkdirs) do
local npos = vector.add(pos, ofst)
local nbr = minetest.get_node(npos)
if minetest.get_item_group(nbr.name, "flammable") > 0
and not nodecore.quenched(npos) then
nodecore.fire_check_ignite(npos, nbr)
end
end
end
})
------------------------------------------------------------------------
local log2 = math_log(2)
local function saptorchlife(expire, pos)
local max = nodecore.saptorch_life_stages
if expire <= nodecore.gametime then return max end
local life = (expire - nodecore.gametime) / nodecore.saptorch_life_base
if life > 1 then return 1 end
local stage = 1 - math_ceil(math_log(life) / log2)
if stage < 1 then return 1 end
if stage > max then return max end
if pos and (stage >= 2) then
nodecore.smokefx(pos, {
time = 1,
rate = (stage - 1) / 2,
scale = 0.25
})
end
return stage
end
local function snufffx(pos)
nodecore.smokeburst(pos, 4)
return nodecore.sound_play("nc_fire_snuff", {gain = 1, pos = pos})
end
------------------------------------------------------------------------
minetest.register_abm({
label = "saptorch snuff",
interval = 1,
chance = 1,
nodenames = {"group:saptorch_lit"},
action = function(pos, node)
local expire = nodecore.get_saptorch_expire(minetest.get_meta(pos), node.name)
if nodecore.quenched(pos) or nodecore.gametime > expire then
minetest.remove_node(pos)
minetest.add_item(pos, {name = "nc_fire:lump_ash"})
snufffx(pos)
return
end
local nn = modname .. ":saptorch_lit_" .. saptorchlife(expire, pos)
if node.name ~= nn then
node.name = nn
return minetest.swap_node(pos, node)
end
end
})
------------------------------------------------------------------------
nodecore.register_aism({
label = "saptorch stack interact",
itemnames = {"group:saptorch_lit"},
action = function(stack, data)
local pos = data.pos
local player = data.player
local wield
if player and data.list == "main"
and player:get_wield_index() == data.slot then
wield = true
pos = vector.add(pos, vector.multiply(player:get_look_dir(), 0.5))
end
local expire, dirty = nodecore.get_saptorch_expire(stack:get_meta(), stack:get_name())
if (expire < nodecore.gametime)
or nodecore.quenched(pos, data.node and 1 or 0.3) then
snufffx(pos)
return "nc_fire:lump_ash"
end
if wield and math_random() < 0.1 then nodecore.fire_check_ignite(pos) end
local nn = modname .. ":saptorch_lit_" .. saptorchlife(expire, pos)
if stack:get_name() ~= nn then
stack:set_name(nn)
return stack
elseif dirty then
return stack
end
end
})
-- ================================================================ --

65
treesap.lua Normal file
View File

@ -0,0 +1,65 @@
-- LUALOCALS < ---------------------------------------------------------
local math, minetest, nodecore, pairs, string, type
= math, minetest, nodecore, pairs, string, type
local math_random
= math.random
local string_sub
= string.sub
-- LUALOCALS > ---------------------------------------------------------
local modname = minetest.get_current_modname()
local saptxr = modname.. "_sap.png"
local sapball = modname .. ":lump_sap"
local sapflam = 60 -- Seems ok for now, will likely adjust after researching chemical properties of various tree saps.
local suff = "_glued"
-- ================================================================== --
minetest.register_craftitem(sapball, {
description = "Resin", --"Sap Lump",
inventory_image = saptxr.. "^[mask:nc_fire_lump.png",
groups = {
sap = 1,
flammable = sapflam
},
sounds = nodecore.sounds("nc_terrain_crunchy")
})
------------------------------------------------------------------------
minetest.register_node(modname .. ":root_dry",
nodecore.underride({
tiles = {
"nc_tree_tree_top.png^[colorize:tan:25",
"nc_terrain_dirt.png",
"nc_terrain_dirt.png^(nc_tree_roots.png^[colorize:tan:25)"
}
}, minetest.registered_items["nc_tree:root"])
)
-- ================================================================== --
minetest.register_abm({ -- soaking abm or dnt might be better
label = "sap exuding",
interval = 60,
chance = 20,
nodenames = {"nc_tree:root"},
action = function(pos, node)
local above = {x = pos.x, y = pos.y + 1, z = pos.z}
local above_node = minetest.get_node(above)
if above_node.name == "air" then
nodecore.item_eject(above, {name = sapball})
if math_random(1, 2) == 1 then return end
minetest.set_node(pos, {name = modname.. ":root_dry"})
end
end
})
-- ================================================================== --
nodecore.register_craft({
label = "glue optic",
action = "pummel",
wield = {name = sapball},
consumewield = 1,
indexkeys = "group:optic_gluable",
duration = 2,
nodes = {{
match = {groups = {optic_gluable = true}}, stacked = false
}},
after = function(pos, data)
data.node.name = data.node.name .. suff
return minetest.swap_node(pos, data.node)
end
})