minetest_winter_is_coming/init.lua

410 lines
11 KiB
Lua

local modpath = minetest.get_modpath("winter_is_coming")
local modname = "winter_is_coming"
local winter_is_coming = {}
minetest.register_node(modname..":frozen_tree_base", {
description = "Frozen Tree",
tiles = {
"default_tree_top.png^"..modname.."_trunkfrost.png",
"default_tree_top.png^"..modname.."_trunkfrost.png",
"default_tree.png^"..modname.."_treefrost.png"},
paramtype2 = "facedir",
is_ground_content = false,
drop = modname..':frozen_tree 1',
groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 2, frost=2},
sounds = default.node_sound_wood_defaults(),
--on_place = minetest.rotate_node
})
minetest.register_node(modname..":frozen_tree", {
description = "Frozen Tree",
tiles = {
"default_tree_top.png^"..modname.."_trunkfrost.png",
"default_tree_top.png^"..modname.."_trunkfrost.png",
"default_tree.png^"..modname.."_trunkfrost.png"},
paramtype2 = "facedir",
is_ground_content = false,
groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 2, frost=2},
sounds = default.node_sound_wood_defaults(),
--on_place = minetest.rotate_node
})
minetest.register_node(modname..":dead_twigs", {
description = "Dead Twigs",
drawtype = "allfaces_optional",
visual_scale = 1.3,
tiles = {modname.."_deadtwigs.png"},
special_tiles = {modname.."_deadtwigs.png"},
paramtype = "light",
drop="default:stick 1",
is_ground_content = false,
groups = {snappy = 3, flammable = 1, leaves = 1, frost=1}
})
minetest.register_node(modname..":dead_twigs_snowy", {
description = "Dead Twigs",
drawtype = "allfaces_optional",
visual_scale = 1.3,
tiles = {modname.."_deadtwigs_snowy.png"},
special_tiles = {modname.."_deadtwigs_snowy.png"},
paramtype = "light",
drop="default:stick 1",
is_ground_content = false,
groups = {snappy = 3, flammable = 1, leaves = 1, frost=1}
})
minetest.register_node(modname..":permafrost", {
description = "Permafrost",
tiles = {"default_dirt.png^"..modname.."_trunkfrost.png"},
groups = {cracky = 2, soil = 1, frost=2},
sounds = default.node_sound_dirt_defaults(),
})
minetest.register_node(modname..":river_ice", {
description = "River Ice",
tiles = {"default_ice.png"},
is_ground_content = false,
paramtype = "light",
groups = {cracky = 3, puts_out_fire = 1},
sounds = default.node_sound_glass_defaults(),
})
-- this is dirt with snow that turns back into dirt with dry grass when thawed
minetest.register_node(modname..":dirt_with_dry_snow", {
description = "Dirt with Snow",
tiles = {"default_snow.png", "default_dirt.png",
{name = "default_dirt.png^default_snow_side.png",
tileable_vertical = false}},
groups = {crumbly = 3, soil = 1},
drop = 'default:dirt',
sounds = default.node_sound_dirt_defaults({
footstep = {name = "default_snow_footstep", gain = 0.15},
}),
})
winter_is_coming.check_waving_snow = function(pos)
local myname = minetest.get_node(pos).name
pos.y = pos.y - 1
local uname = minetest.get_node(pos).name
local nodedef = minetest.registered_nodes[uname]
pos.y = pos.y + 1
if nodedef ~= nil and nodedef.waving ~= nil then
-- it's waving, we should too
if myname == "default:snow" then
minetest.set_node(pos, {name = modname..":waving_snow"})
end
elseif myname == modname..":waving_snow" then
minetest.set_node(pos, {name = "default:snow"})
end
end
-- waiting on engine support for nodeboxed drawtypes. in the mean time large waving snow is better than thin floating snow
minetest.register_node(modname..":waving_snow", {
description = "Snow",
tiles = {"default_snow.png"},
waving = 1,
inventory_image = "default_snowball.png",
wield_image = "default_snowball.png",
paramtype = "light",
buildable_to = true,
drawtype = "allfaces_optional",
node_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, -0.25, 0.5},
},
},
groups = {crumbly = 3, falling_node = 1, puts_out_fire = 1},
sounds = default.node_sound_dirt_defaults({
footstep = {name = "default_snow_footstep", gain = 0.15},
dug = {name = "default_snow_footstep", gain = 0.2},
dig = {name = "default_snow_footstep", gain = 0.2}
}),
drops="default:snow",
on_construct = winter_is_coming.check_waving_snow,
})
minetest.register_abm({
nodenames = { "default:snow"},
neighbors = { "group:leaves" },
interval = 1,
chance = 5,
action = winter_is_coming.check_waving_snow,
})
local freeze_pairs = {
["default:dirt"] = modname..":permafrost",
["default:dirt_with_grass"] = "default:dirt_with_snow",
["default:dirt_with_grass_footsteps"] = "default:dirt_with_snow",
["default:dirt_with_dry_grass"] = modname..":dirt_with_dry_snow",
["default:tree"] = modname..":frozen_tree",
["default:water_source"] = "default:ice",
["default:river_water_source"] = modname..":river_ice",
}
winter_is_coming.init = function()
local n=0
local freeze_keys = {}
local freeze_vals = {}
for k,v in pairs(freeze_pairs) do
n=n+1
freeze_keys[n]=k
freeze_vals[n]=v
end
minetest.register_abm({
nodenames = freeze_keys,
neighbors = freeze_vals,
interval = 2,
chance = 20,
catch_up = false,
action = function(pos, node, active_object_count, active_object_count_wider)
local frozen_name = freeze_pairs[node.name]
if frozen_name == nil then
return
end
-- don't freeze near furnaces
if nil ~= minetest.find_node_near(pos, 4, {"default:furnace"}) then
return
end
local n = {x=pos.x, y=pos.y, z=pos.z}
n.y = n.y + 1
local q = minetest.get_node(n)
if q ~= nil then -- extra environment checks
if minetest.get_item_group(q.name, "flora") > 0 then
minetest.set_node(n, {name="default:dry_shrub"})
end
-- the base of trees have special tiles
if q.name == "default:tree" and node.name == "default:tree" then
frozen_name = modname..":frozen_tree_base"
end
end
-- fix rotation of logs
local nodedef = minetest.registered_nodes[node.name]
if nodedef ~= nil and nodedef.paramtype2 == "facedir" then
minetest.set_node(pos, {name=frozen_name, param2 = node.param2})
else
minetest.set_node(pos, {name=frozen_name})
end
end,
})
end
-- fix stupid default game political decisions
minetest.registered_nodes["default:snow"].node_box.type = "leveled"
winter_is_coming.init()
--[[
minetest.register_abm({
nodenames = { "default:snow" },
interval = 1,
chance = 5,
action = function(pos, node, active_object_count, active_object_count_wider)
local n = minetest.find_node_near(pos, 2, {"default:dirt_with_grass"})
if n == nil then
return
end
-- don't freeze near furnaces
if nil ~= minetest.find_node_near(n, 4, {"default:furnace_active"}) then
return
end
minetest.set_node(n, {name="default:dirt_with_snow"})
n.y = n.y + 1
local q = minetest.get_node(n)
if q == nil then
return
end
if minetest.get_item_group(q.name, "flora") > 0 then
minetest.set_node(n, {name="default:dry_shrub"})
return
end
if q.name == "default:tree" then
n.y = n.y + 1
local r = minetest.get_node(n)
if r.name == "default:tree" then
minetest.set_node(q.pos, {name=modname..":frozen_tree_base", param2=q.param2})
return
end
end
end,
})
]]
-- snow accumulation on parts of nature
--[[ very broken atm, works far too well
minetest.register_abm({
nodenames = {"group:tree", "group:leaves" },
neighbors = {"air"},
interval = 2,
chance = 20,
catch_up = false,
action = function(pos, node)
local above = {x = pos.x, y = pos.y + 1, z = pos.z}
local a = minetest.get_node(above)
if a.name ~= "air" then
return
end
-- make sure some snow or ice is nearby
local n = minetest.find_node_near(pos, 6,
{"default:snow", "default:snowblock", "default:ice", modname..":waving_snow", modname..":river_ice"})
if n == nil then
return
end
minetest.set_node(above, {name = "default:snow"})
end
})
]]
--[[
minetest.register_abm({
nodenames = { "default:snow"},
interval = 1,
chance = 5,
action = function(pos, node, active_object_count, active_object_count_wider)
local n = minetest.find_node_near(pos, 1, {"default:tree"})
if n ~= nil then
minetest.set_node(n, {name=modname..":frozen_tree"})
end
end,
})
]]
--[[
-- trees grow frost
minetest.register_abm({
nodenames = { modname..":frozen_tree_base", modname..":frozen_tree"},
interval = 1,
chance = 10,
action = function(pos, node, active_object_count, active_object_count_wider)
local n = minetest.find_node_near(pos, 1, {"default:tree"})
if n ~= nil then
minetest.set_node(n, {name=modname..":frozen_tree", param2=node.param2})
end
end,
})
-- trees grow frost
minetest.register_abm({
nodenames = { modname..":frozen_tree_base", modname..":frozen_tree", modname..":dead_twigs"},
interval = 1,
chance = 10,
action = function(pos, node, active_object_count, active_object_count_wider)
local n = minetest.find_node_near(pos, 1, {"default:leaves"})
if n ~= nil then
minetest.set_node(n, {name=modname..":dead_twigs"})
end
end,
})
]]
-- snow piles up
minetest.register_abm({
nodenames = { "default:dirt_with_snow" },
neighbors = { "air" },
interval = 5,
chance = 5,
action = function(pos, node, active_object_count, active_object_count_wider)
local n = minetest.find_node_near(pos, 1, {"default:dirt_with_snow"})
if n ~= nil then
n.y = n.y + 1
-- don't freeze near torches
if nil ~= minetest.find_node_near(n, 1, {"default:torch"}) then
return
end
local q = minetest.get_node(n)
if q ~= nil and (q.name == "air" or q.name == "default:grass") then
minetest.set_node(n, {name="default:snow"})
end
end
end,
})
-- snowy grass spreads
minetest.register_abm({
nodenames = { "default:dirt_with_snow" },
neighbors = { "default:dirt_with_grass", "default:dirt_with_rainforest_litter", "default:dirt_with_dry_grass" },
interval = 5,
chance = 5,
action = function(pos, node, active_object_count, active_object_count_wider)
local n = minetest.find_node_near(pos, 1, {"default:dirt_with_grass", "default:dirt_with_rainforest_litter", "default:dirt_with_dry_grass"})
if n ~= nil then
-- don't freeze near torches
if nil ~= minetest.find_node_near(n, 3, {"default:torch"}) then
return
end
minetest.set_node(n, {name="default:dirt_with_snow"})
n.y = n.y + 1
local q = minetest.get_node(n)
if q == nil then
return
end
if minetest.get_item_group(q.name, "flora") > 0 then
minetest.set_node(n, {name="default:dry_shrub"})
return
end
if q.name == "default:tree" then
n.y = n.y + 1
local r = minetest.get_node(n)
if r.name == "default:tree" then
minetest.set_node(q.pos, {name=modname..":frozen_tree_base", param2=q.param2})
return
end
end
end
end,
})
-- twigs get snowy
minetest.register_abm({
nodenames = { modname..":dead_twigs" },
interval = 10,
chance = 50,
action = function(pos, node, active_object_count, active_object_count_wider)
minetest.set_node(pos, {name=modname..":dead_twigs_snowy"})
end,
})