mirror of
https://github.com/t-affeldt/regional_weather.git
synced 2024-11-16 07:30:26 +01:00
181 lines
5.0 KiB
Lua
181 lines
5.0 KiB
Lua
local BLOCK_PREFIX = "regional_weather:snow_cover_"
|
|
local CHECK_DISTANCE = 3
|
|
local MAX_AMOUNT = 20
|
|
|
|
local S = regional_weather.i18n
|
|
|
|
if not minetest.get_modpath("default")
|
|
or default.node_sound_snow_defaults == nil
|
|
or not regional_weather.settings.snow then
|
|
for i = 1,5 do
|
|
minetest.register_alias(BLOCK_PREFIX .. i, "air")
|
|
end
|
|
return
|
|
end
|
|
|
|
local destruction_handler = function(pos)
|
|
pos.y = pos.y - 1
|
|
if minetest.get_node(pos).name == "default:dirt_with_snow" then
|
|
minetest.set_node(pos, {name = "default:dirt_with_grass"})
|
|
end
|
|
end
|
|
|
|
for i = 1,5 do
|
|
local node_box = {
|
|
type = "fixed",
|
|
fixed = {-0.5, -0.5, -0.5, 0.5, 0.2*i - 0.5, 0.5}
|
|
}
|
|
|
|
minetest.register_node(BLOCK_PREFIX .. i, {
|
|
description = S("Snow Cover"),
|
|
tiles = { "default_snow.png" },
|
|
drawtype = "nodebox",
|
|
buildable_to = i < 3,
|
|
floodable = true,
|
|
walkable = i > 3,
|
|
paramtype = "light",
|
|
node_box = node_box,
|
|
groups = {
|
|
not_in_creative_inventory = 1,
|
|
crumbly = 3,
|
|
falling_node = 1,
|
|
snowy = 1,
|
|
weather_snow_cover = i
|
|
},
|
|
sounds = default.node_sound_snow_defaults(),
|
|
drop = "default:snow " .. math.ceil(i / 2),
|
|
on_construct = function(pos)
|
|
pos.y = pos.y - 1
|
|
if minetest.get_node(pos).name == "default:dirt_with_grass" then
|
|
minetest.set_node(pos, {name = "default:dirt_with_snow"})
|
|
end
|
|
end,
|
|
on_destruct = destruction_handler,
|
|
on_flood = destruction_handler
|
|
})
|
|
end
|
|
|
|
climate_api.register_abm({
|
|
label = "create snow covers",
|
|
nodenames = {
|
|
"group:soil",
|
|
"group:leaves",
|
|
"group:stone",
|
|
"default:snowblock",
|
|
"group:coverable_by_snow"
|
|
},
|
|
neighbors = { "air" },
|
|
interval = 25,
|
|
chance = 40,
|
|
catch_up = false,
|
|
|
|
conditions = {
|
|
min_height = regional_weather.settings.min_height,
|
|
max_height = regional_weather.settings.max_height,
|
|
min_humidity = 55,
|
|
max_heat = 30,
|
|
daylight = 15,
|
|
not_biome = {
|
|
"cold_desert",
|
|
"cold_desert_ocean",
|
|
"desert",
|
|
"desert_ocean",
|
|
"sandstone_desert",
|
|
"sandstone_desert_ocean"
|
|
}
|
|
},
|
|
|
|
pos_override = function(pos)
|
|
return vector.add(pos, { x = 0, y = 1, z = 0 })
|
|
end,
|
|
|
|
action = function (pos, node, env)
|
|
-- only override air nodes
|
|
if node.name ~= "air" then return end
|
|
-- do not place snow if area is not fully loaded
|
|
if minetest.find_node_near(pos, CHECK_DISTANCE, "ignore") then return end
|
|
-- do not place snow if already enpugh snow
|
|
local pos1 = vector.add(pos, { x = -CHECK_DISTANCE, y = -1, z = -CHECK_DISTANCE })
|
|
local pos2 = vector.add(pos, { x = CHECK_DISTANCE, y = 1, z = CHECK_DISTANCE })
|
|
local preplaced = minetest.find_nodes_in_area(pos1, pos2, "group:weather_snow_cover")
|
|
if preplaced ~= nil and #preplaced >= MAX_AMOUNT then return end
|
|
minetest.set_node(pos, { name = BLOCK_PREFIX .. "1" })
|
|
end
|
|
})
|
|
|
|
climate_api.register_abm({
|
|
label = "replace flora with snow covers and stack covers higher",
|
|
nodenames = {
|
|
"group:flora",
|
|
"group:grass",
|
|
"group:plant",
|
|
"group:weather_snow_cover"
|
|
},
|
|
neighbors = { "air" },
|
|
interval = 25,
|
|
chance = 30,
|
|
catch_up = false,
|
|
|
|
conditions = {
|
|
min_height = regional_weather.settings.min_height,
|
|
max_height = regional_weather.settings.max_height,
|
|
min_humidity = 55,
|
|
max_heat = 30,
|
|
daylight = 15,
|
|
not_biome = {
|
|
"cold_desert",
|
|
"cold_desert_ocean",
|
|
"desert",
|
|
"desert_ocean",
|
|
"sandstone_desert",
|
|
"sandstone_desert_ocean"
|
|
}
|
|
},
|
|
|
|
action = function (pos, node, env)
|
|
local value = minetest.get_item_group(node.name, "weather_snow_cover") or 0
|
|
if value == 0 then
|
|
-- do not override plants unless marked as buildable_to
|
|
local def = minetest.registered_nodes[node.name]
|
|
if def == nil or not def.buildable_to then return end
|
|
-- do not override plants of the frost_resistance group
|
|
local resistance = minetest.get_item_group(node.name, "frost_resistance") or 0
|
|
if resistance > 0 then return end
|
|
end
|
|
-- do not place snow if area is not fully loaded
|
|
if minetest.find_node_near(pos, CHECK_DISTANCE, "ignore") then return end
|
|
-- do not place snow if already enpugh snow
|
|
local pos1 = vector.add(pos, { x = -CHECK_DISTANCE, y = -1, z = -CHECK_DISTANCE })
|
|
local pos2 = vector.add(pos, { x = CHECK_DISTANCE, y = 1, z = CHECK_DISTANCE })
|
|
local preplaced = minetest.find_nodes_in_area(pos1, pos2, "group:weather_snow_cover")
|
|
if preplaced ~= nil and #preplaced >= MAX_AMOUNT then return end
|
|
if value < 5 then
|
|
minetest.set_node(pos, { name = BLOCK_PREFIX .. (value + 1) })
|
|
end
|
|
end
|
|
})
|
|
|
|
climate_api.register_abm({
|
|
label = "melt snow covers",
|
|
nodenames = { "group:weather_snow_cover" },
|
|
interval = 15,
|
|
chance = 4,
|
|
catch_up = true,
|
|
|
|
conditions = {
|
|
min_heat = 30
|
|
},
|
|
|
|
action = function (pos, node, env)
|
|
local value = minetest.get_item_group(node.name, "weather_snow_cover")
|
|
if value == nil then value = 0 end
|
|
if value > 1 then
|
|
minetest.set_node(pos, { name = BLOCK_PREFIX .. (value - 1) })
|
|
elseif regional_weather.settings.puddles then
|
|
minetest.set_node(pos, regional_weather.get_random_puddle())
|
|
else
|
|
minetest.set_node(pos, { name = "air" })
|
|
end
|
|
end
|
|
})
|