mirror of
				https://github.com/t-affeldt/regional_weather.git
				synced 2025-10-31 16:15:30 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			144 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			144 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| local BLOCK_PREFIX = "regional_weather:snow_cover_"
 | |
| 
 | |
| 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, {
 | |
| 		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,
 | |
| 			regional_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	= 15,
 | |
| 	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
 | |
| 	 },
 | |
| 
 | |
| 	 pos_override = function(pos)
 | |
| 		 return vector.add(pos, { x = 0, y = 1, z = 0 })
 | |
| 	 end,
 | |
| 
 | |
|    action = function (pos, node, env)
 | |
| 		 if minetest.get_node(pos).name ~= "air" then return end
 | |
| 		 local base = minetest.get_node(vector.add(pos, {x=0, y=-1, z=0})).name
 | |
| 		 local is_soil = minetest.get_item_group(base, "soil") or 0
 | |
| 		 local is_stone = minetest.get_item_group(base, "stone") or 0
 | |
| 		 if not (is_soil == 0 and is_stone == 0) then
 | |
| 		 	minetest.set_node(pos, { name = BLOCK_PREFIX .. "1" })
 | |
| 		end
 | |
| 	 end
 | |
| })
 | |
| 
 | |
| climate_api.register_abm({
 | |
| 	label			= "replace flora with snow covers and stack covers higher",
 | |
| 	nodenames	= {
 | |
| 		"group:flora",
 | |
| 		"group:grass",
 | |
| 		"group:plant",
 | |
| 		"group:regional_weather_snow_cover"
 | |
| 	},
 | |
| 	interval	= 15,
 | |
| 	chance		= 25,
 | |
| 	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
 | |
| 	 },
 | |
| 
 | |
|    action = function (pos, node, env)
 | |
| 		 local node_name = minetest.get_node(pos).name
 | |
| 		 local value = minetest.get_item_group(node_name, "regional_weather_snow_cover")
 | |
| 		 if value == nil then value = 0 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:regional_weather_snow_cover" },
 | |
| 	interval	= 15,
 | |
| 	chance		= 10,
 | |
| 	catch_up	= true,
 | |
| 
 | |
| 	 conditions	= {
 | |
| 		 min_heat = 30
 | |
| 	 },
 | |
| 
 | |
|    action = function (pos, node, env)
 | |
| 			local node_name = minetest.get_node(pos).name
 | |
| 			local value = minetest.get_item_group(node_name, "regional_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, { name = "regional_weather:puddle" })
 | |
| 			else
 | |
| 				minetest.set_node(pos, { name = "air" })
 | |
| 			end
 | |
| 	 end
 | |
| })
 |