From 0f258b989baae40a0d484f508db181a5258d5362 Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Sun, 30 Aug 2015 23:21:16 +0200 Subject: [PATCH] So far, disable snow mapgen from snow --- mods/snow/.gitignore | 3 + mods/snow/LazyJ-changelog.txt | 162 +++++ mods/snow/changelog.txt | 67 ++ mods/snow/depends.txt | 4 + mods/snow/init.lua | 191 +++++ mods/snow/license.txt | 674 ++++++++++++++++++ mods/snow/models/sled.blend | Bin 0 -> 430048 bytes mods/snow/models/sled.png | Bin 0 -> 2952 bytes mods/snow/models/sled.x | 369 ++++++++++ .../other_textures/connected_textures_ice.png | Bin 0 -> 656 bytes mods/snow/other_textures/default_ice.png | Bin 0 -> 82 bytes mods/snow/other_textures/default_ice.xcf | Bin 0 -> 1681 bytes .../other_textures/inkscape_default_ice.svg | 67 ++ mods/snow/other_textures/mocha.png | Bin 0 -> 83 bytes mods/snow/other_textures/mocha.xcf | Bin 0 -> 665 bytes .../original_snow_snow_brick.png | Bin 0 -> 300 bytes mods/snow/other_textures/rect2985.png | Bin 0 -> 81 bytes mods/snow/other_textures/snow_ice.png | Bin 0 -> 371 bytes .../snow_needles_decorated_animated.xcf | Bin 0 -> 15052 bytes mods/snow/other_textures/snow_snow.png | Bin 0 -> 164 bytes mods/snow/other_textures/snow_snow_brick.xcf | Bin 0 -> 1539 bytes .../other_textures/snow_snow_cobble.png_01 | Bin 0 -> 570 bytes mods/snow/other_textures/snow_snow_cobble.xcf | Bin 0 -> 1776 bytes mods/snow/other_textures/snow_snow_side.png | Bin 0 -> 726 bytes mods/snow/other_textures/snow_snowball.png | Bin 0 -> 127 bytes mods/snow/other_textures/snow_snowfall.png | Bin 0 -> 190 bytes mods/snow/other_textures/snow_star_lit.xcf | Bin 0 -> 1480 bytes mods/snow/other_textures/xdefault_cobble.png | Bin 0 -> 297 bytes .../xdefault_furnace_bottom.png | Bin 0 -> 602 bytes .../xdefault_furnace_fire_bg.png | Bin 0 -> 204 bytes .../xdefault_furnace_fire_fg.png | Bin 0 -> 719 bytes .../other_textures/xdefault_furnace_front.png | Bin 0 -> 553 bytes .../xdefault_furnace_front_active.png | Bin 0 -> 4277 bytes .../other_textures/xdefault_furnace_side.png | Bin 0 -> 602 bytes .../other_textures/xdefault_furnace_top.png | Bin 0 -> 602 bytes mods/snow/other_textures/xdefault_glass.png | Bin 0 -> 204 bytes mods/snow/other_textures/xdefault_ice.png | Bin 0 -> 371 bytes mods/snow/other_textures/xdefault_ice.xcf | Bin 0 -> 1400 bytes mods/snow/other_textures/xdefault_snow.png | Bin 0 -> 164 bytes .../other_textures/xdefault_stone_brick.png | Bin 0 -> 572 bytes mods/snow/readme.txt | 103 +++ mods/snow/schematics/pine.mts | Bin 0 -> 99 bytes mods/snow/src/abms.lua | 208 ++++++ mods/snow/src/aliases.lua | 104 +++ mods/snow/src/basic_stairs_slabs.lua | 302 ++++++++ mods/snow/src/crafting.lua | 216 ++++++ mods/snow/src/falling_snow.lua | 234 ++++++ mods/snow/src/mapgen.lua | 160 +++++ mods/snow/src/mapgen_v6.lua | 486 +++++++++++++ mods/snow/src/mapgen_v7.lua | 138 ++++ mods/snow/src/nodes.lua | 360 ++++++++++ mods/snow/src/sled.lua | 231 ++++++ mods/snow/src/snowball.lua | 345 +++++++++ mods/snow/src/stairsplus.lua | 342 +++++++++ mods/snow/src/util.lua | 156 ++++ mods/snow/textures/character_snow_man.png | Bin 0 -> 1630 bytes .../textures/character_snow_man_preview.png | Bin 0 -> 3805 bytes .../character_snow_man_preview_back.png | Bin 0 -> 3359 bytes mods/snow/textures/default_ice.png | Bin 0 -> 150 bytes mods/snow/textures/default_snowball.png | Bin 0 -> 211 bytes mods/snow/textures/snow_apple.png | Bin 0 -> 249 bytes mods/snow/textures/snow_dandelion_white.png | Bin 0 -> 122 bytes mods/snow/textures/snow_dandelion_yellow.png | Bin 0 -> 118 bytes mods/snow/textures/snow_geranium.png | Bin 0 -> 269 bytes mods/snow/textures/snow_ice_brick.png | Bin 0 -> 665 bytes mods/snow/textures/snow_leaves.png | Bin 0 -> 190 bytes mods/snow/textures/snow_moss.png | Bin 0 -> 619 bytes mods/snow/textures/snow_needles.png | Bin 0 -> 660 bytes mods/snow/textures/snow_needles_decorated.png | Bin 0 -> 884 bytes .../snow_needles_decorated_animated.png | Bin 0 -> 1594 bytes mods/snow/textures/snow_rose.png | Bin 0 -> 120 bytes mods/snow/textures/snow_sapling_pine.png | Bin 0 -> 272 bytes mods/snow/textures/snow_shrub.png | Bin 0 -> 262 bytes mods/snow/textures/snow_shrub_covering.png | Bin 0 -> 229 bytes mods/snow/textures/snow_sled.png | Bin 0 -> 327 bytes mods/snow/textures/snow_snow_brick.png | Bin 0 -> 319 bytes mods/snow/textures/snow_snow_cobble.png | Bin 0 -> 737 bytes mods/snow/textures/snow_star.png | Bin 0 -> 349 bytes mods/snow/textures/snow_star_lit.png | Bin 0 -> 302 bytes mods/snow/textures/snow_tulip.png | Bin 0 -> 124 bytes mods/snow/textures/snow_viola.png | Bin 0 -> 117 bytes mods/snow/textures/snow_xmas_tree.png | Bin 0 -> 299 bytes mods/snow/textures/weather_snow.png | Bin 0 -> 588 bytes 83 files changed, 4922 insertions(+) create mode 100755 mods/snow/.gitignore create mode 100755 mods/snow/LazyJ-changelog.txt create mode 100755 mods/snow/changelog.txt create mode 100755 mods/snow/depends.txt create mode 100755 mods/snow/init.lua create mode 100755 mods/snow/license.txt create mode 100755 mods/snow/models/sled.blend create mode 100755 mods/snow/models/sled.png create mode 100755 mods/snow/models/sled.x create mode 100755 mods/snow/other_textures/connected_textures_ice.png create mode 100755 mods/snow/other_textures/default_ice.png create mode 100755 mods/snow/other_textures/default_ice.xcf create mode 100755 mods/snow/other_textures/inkscape_default_ice.svg create mode 100755 mods/snow/other_textures/mocha.png create mode 100755 mods/snow/other_textures/mocha.xcf create mode 100755 mods/snow/other_textures/original_snow_snow_brick.png create mode 100755 mods/snow/other_textures/rect2985.png create mode 100755 mods/snow/other_textures/snow_ice.png create mode 100755 mods/snow/other_textures/snow_needles_decorated_animated.xcf create mode 100755 mods/snow/other_textures/snow_snow.png create mode 100755 mods/snow/other_textures/snow_snow_brick.xcf create mode 100755 mods/snow/other_textures/snow_snow_cobble.png_01 create mode 100755 mods/snow/other_textures/snow_snow_cobble.xcf create mode 100755 mods/snow/other_textures/snow_snow_side.png create mode 100755 mods/snow/other_textures/snow_snowball.png create mode 100755 mods/snow/other_textures/snow_snowfall.png create mode 100755 mods/snow/other_textures/snow_star_lit.xcf create mode 100755 mods/snow/other_textures/xdefault_cobble.png create mode 100755 mods/snow/other_textures/xdefault_furnace_bottom.png create mode 100755 mods/snow/other_textures/xdefault_furnace_fire_bg.png create mode 100755 mods/snow/other_textures/xdefault_furnace_fire_fg.png create mode 100755 mods/snow/other_textures/xdefault_furnace_front.png create mode 100755 mods/snow/other_textures/xdefault_furnace_front_active.png create mode 100755 mods/snow/other_textures/xdefault_furnace_side.png create mode 100755 mods/snow/other_textures/xdefault_furnace_top.png create mode 100755 mods/snow/other_textures/xdefault_glass.png create mode 100755 mods/snow/other_textures/xdefault_ice.png create mode 100755 mods/snow/other_textures/xdefault_ice.xcf create mode 100755 mods/snow/other_textures/xdefault_snow.png create mode 100755 mods/snow/other_textures/xdefault_stone_brick.png create mode 100755 mods/snow/readme.txt create mode 100755 mods/snow/schematics/pine.mts create mode 100755 mods/snow/src/abms.lua create mode 100755 mods/snow/src/aliases.lua create mode 100755 mods/snow/src/basic_stairs_slabs.lua create mode 100755 mods/snow/src/crafting.lua create mode 100755 mods/snow/src/falling_snow.lua create mode 100755 mods/snow/src/mapgen.lua create mode 100755 mods/snow/src/mapgen_v6.lua create mode 100755 mods/snow/src/mapgen_v7.lua create mode 100755 mods/snow/src/nodes.lua create mode 100755 mods/snow/src/sled.lua create mode 100755 mods/snow/src/snowball.lua create mode 100755 mods/snow/src/stairsplus.lua create mode 100755 mods/snow/src/util.lua create mode 100755 mods/snow/textures/character_snow_man.png create mode 100755 mods/snow/textures/character_snow_man_preview.png create mode 100755 mods/snow/textures/character_snow_man_preview_back.png create mode 100755 mods/snow/textures/default_ice.png create mode 100755 mods/snow/textures/default_snowball.png create mode 100755 mods/snow/textures/snow_apple.png create mode 100755 mods/snow/textures/snow_dandelion_white.png create mode 100755 mods/snow/textures/snow_dandelion_yellow.png create mode 100755 mods/snow/textures/snow_geranium.png create mode 100755 mods/snow/textures/snow_ice_brick.png create mode 100755 mods/snow/textures/snow_leaves.png create mode 100755 mods/snow/textures/snow_moss.png create mode 100755 mods/snow/textures/snow_needles.png create mode 100755 mods/snow/textures/snow_needles_decorated.png create mode 100755 mods/snow/textures/snow_needles_decorated_animated.png create mode 100755 mods/snow/textures/snow_rose.png create mode 100755 mods/snow/textures/snow_sapling_pine.png create mode 100755 mods/snow/textures/snow_shrub.png create mode 100755 mods/snow/textures/snow_shrub_covering.png create mode 100755 mods/snow/textures/snow_sled.png create mode 100755 mods/snow/textures/snow_snow_brick.png create mode 100755 mods/snow/textures/snow_snow_cobble.png create mode 100755 mods/snow/textures/snow_star.png create mode 100755 mods/snow/textures/snow_star_lit.png create mode 100755 mods/snow/textures/snow_tulip.png create mode 100755 mods/snow/textures/snow_viola.png create mode 100755 mods/snow/textures/snow_xmas_tree.png create mode 100755 mods/snow/textures/weather_snow.png diff --git a/mods/snow/.gitignore b/mods/snow/.gitignore new file mode 100755 index 00000000..43ed67f5 --- /dev/null +++ b/mods/snow/.gitignore @@ -0,0 +1,3 @@ +config.txt +debug.txt +*~ diff --git a/mods/snow/LazyJ-changelog.txt b/mods/snow/LazyJ-changelog.txt new file mode 100755 index 00000000..89c30c89 --- /dev/null +++ b/mods/snow/LazyJ-changelog.txt @@ -0,0 +1,162 @@ +~ LazyJ, 2014_06_01 + +~~~~~~~~~~~~~~~~~~~~ +List of Changes +~~~~~~~~~~~~~~~~~~~~ + + + +##### MapGen + +I did *not* fix Snow's mapgen issue with "PlantLife" (another great, Minetest +standard) based mods. Mapgen stuff is far beyond my current skill level. +What little changes I did make were to switch-out Snow nodes that Minetest +now has as defaults (dirt_with_snow, snow, ice). My thoughts being that +texture packs and other mods that may use these nodes as recipe items are more +likely to support default nodes. I also added a line above and below in the +"mapgen.lua" file indicating where to put the comment symbols to +comment-out/disable Snow's mapgen. Mods based on VanessaE's excellent +"PlantLife" mod will not produce if Snow's mapgen is active. +*Snow's mapgen is active by default.* +I did not disable it, merely indicated were the comment symbols are +to be placed. To compensate for the loss of snow resources when Snow's mapgen +is disabled, I created crafting recipes that allows players to craft more +snow, ice, and moss. This not only encourages snow builds, but also allows +the players to create snow biomes where they want and whatever size they are +willing to make them. + + +##### Fixed + * Pine saplings are now replaced with tree trunks when the tree grows. + * Snowballs no longer pass through solid objects. Griefers can no + longer flood the interiors of builds by throwing snowballs through the + walls hoping to either leave a snowy mess inside or that a heat source + would melt the snow and flood the interior. + * Snowballs no longer destroy nodes when thrown at the sides. + * Falling snow no longer destroys nodes (same problem snowballs had). + * Snow bricks now, instead of disappearing like before, melt + into water sources. + * Christmas tree saplings once again will drop when pine needles + are harvested. + * Dirt_with_snow changes to dirt when a solid, non-light permeating + (sunlight_propagates) block is set on top of it. + + + +##### Changed + * All snow and ice stuff (including the stairs, slabs, panels, and + microblocks) will freeze dirt and dirt_with_grass into dirt_with_snow. + * All snow and most ice stuff will freeze water into ice, including + the stairs, slabs, panels, and microblocks. The exception is the + full-sized ice blocks will *not* freeze water into ice. + * Snow brick texture reworked and based off of the default stone brick + texture (and less purple in the grout). + * Ice stuff is now semi-transparent. + * Christmas trees now have blinking lights that give off a + low level of light. + * Christmas tree stars now give off a high level of light and the + light can be punched on or off. + * Combined default snow and snowballs. Now snow can be + thrown (left-click) or placed (right-click). + * Snow stuff now has "snow" sounds instead of "grass" sounds. + * Melting - Full-sized snow blocks, snow brick, snow cobble, and ice + will melt into water sources. The down-side is this makes a big, + permanent mess. The up-side, this is a convenient way to carry water, + if buckets are disabled on your server, by keeping full-sized snow + stuff and ice blocks in your inventory to, later, melt where you + need water. + * Melting - Partial and small-sized blocks like snow (snowballs), + basic stairs and slabs for snow stuff and ice, and circular saw-made + snow stuff and ice things will melt into a water source for 2 seconds, + then switch from a water source to flowing water, and after a moment + the flowing water dries-up (small, temporary mess). + + + +##### Added + * New block-type: "Snow Cobble". Just like regular cobble from regular + stone, snow cobble comes from digging snow blocks. + * All snow and ice blocks can be crafted into basic slabs and stairs. + The default slabs stack and change back into full-sized blocks + ("More Blocks" slabs won't do this). + * Soft dependency on a recent release Calinou's MoreBlocks so all + snow and ice blocks are compatible with the circular saw. If you don't + have MoreBlocks installed, Snow will ignore the code for those fancy + blocks and use basic stairs and slabs instead. + * All snow and ice stuff works with the screwdriver. + * Crafting, recycling, and cooking recipes for snow blocks, + ice, and moss. + * Snow bricks craft-recycle back into 4 snow blocks. + * 2 snow blocks craft into 3 snow blocks. This is to make up + for when the mapgen for snow biomes is disabled. + * 2 snow cobble craft-recycle into 3 snow blocks. + * 4 pine needles craft into 1 moss + * Snow blocks, snow cobble, and snow bricks can be cooked in a + furnace to make ice. + * Snowballs can be thrown (left-click) to build up layers. After the + 11th layer, the bottom 9 layers change into a snow block. At a very + close distance, throwing snowballs can be used as a technique to + build-up gradual slopes. If you have lots and lots of snow balls, + with rapid-fire throwing, you can, very briefly, "white-out" another + player's view if your aim is good enough to hit them in the face. + * Snowballs can be placed (right-click) but will not stack into + multiple layers. Just one layer only. Placing snow is more reliable + and accurate than throwing snow from a distance. By placing snow, + players are able to create their own, personal, snow biomes. + * Vertical clearance check for tree growth. The nine blocks above the + spot where the sapling is placed must be free and clear of all + obstructions or else the sapling will not be allowed to grow. + Griefers could place the saplings in builds and when the tree grows + it may not destroy nodes but it fills the available air space leaving + a mess for the build's owner to clean-up. Now the trees will only grow + inside if there is 9, free-and-clear spaces from floor to ceiling. + Because pine trees (and Christmas trees) will grow on any solid surface, + their saplings are handy to take with you when deep mining. Just before + you run out of tool wood, dig out a space large enough for a tree to + grow, plant a pine or Christmas tree sapling then place 2 torches on + either side, right next to the sapling. After the tree grows harvest + the trunk for tool wood, the leaves for short-run fuel in the furnace + and for saplings to renew your tool wood supply again. + * Aliases to help make WorldEdit and "give" commands easier: + + + "default_snow" = "default:snow" + "snowball" = "default:snow" + "snowballs" = "default:snow" + "snow_ball" = "default:snow" + "ice" = "default:ice" + "default_ice" = "default:ice" + "dirtwithsnow" = "default:dirt_with_snow" + "snowdirt" = "default:dirt_with_snow" + "snowydirt" = "default:dirt_with_snow" + "snowblocks" = "default:snowblock" + "snowbrick" = "snow:snow_brick" + "bricksnow" = "snow:snow_brick" + "snowbricks" = "snow:snow_brick" + "snowybricks" = "snow:snow_brick" + "snowcobble" = "snow:snow_cobble" + "snowycobble" = "snow:snow_cobble" + "cobblesnow" = "snow:snow_cobble" + + + +~~~~~~ +TODO +~~~~~~ + +Falling Snow: + * Add code to prevent snowfall from depositing snow on or near torches, +active furnaces, and lava. + + * Add code to prevent snowfall from depositing snow on +'walkable = false' defined nodes. + + + +Sled: + * Figure out why the player avatars remain in a seated position, +even after getting off the sled, if they flew while on the sled. +'default.player_set_animation', where is a better explanation for this and what +are it's available options? + + diff --git a/mods/snow/changelog.txt b/mods/snow/changelog.txt new file mode 100755 index 00000000..02dd11ef --- /dev/null +++ b/mods/snow/changelog.txt @@ -0,0 +1,67 @@ +CHANGELOG: +------------ + +Version 3.2 + + Update compatibility to the latest minetest. + +Version 0.3.1 + + Paramat's rewrite of mapgenv6.lua: bugfixes, use noisemaps for big speed increase + +Version 3.0 + LazyJ's big changes (see LazyJ-changelog.txt) + + Ice freezes-over. + + Better leveled snow. + + PLUS MORE! (see commit log) + +Version 2.0 + + Uses default namespace. + + Sleds. + + Bugfixes. + +Version 1.8 + + Mapgen_v7 support. + + Better config system. + + Falling snow. + +Version 1.4 + + New biomes, snowy and plain + + Christmas Trees + + Snowfall + +Version 1.3 + + Smooth transitions + + Snow Bricks + +Version 1.2 + + Pine trees + + Moss + + Alpine biomes + + Dry shrubs + +Version 1.1 + + Better mapgen + +Version 1.0 + + Initial release diff --git a/mods/snow/depends.txt b/mods/snow/depends.txt new file mode 100755 index 00000000..59f057db --- /dev/null +++ b/mods/snow/depends.txt @@ -0,0 +1,4 @@ +default +flowers? +moreblocks? +watershed? diff --git a/mods/snow/init.lua b/mods/snow/init.lua new file mode 100755 index 00000000..ce3531aa --- /dev/null +++ b/mods/snow/init.lua @@ -0,0 +1,191 @@ +--[[ +--============================== +--========================================================== +LazyJ's Fork of Splizard's "Snow Biomes" Mod +by LazyJ +version: Umpteen-hundred and 7/5ths something or another. +2014_04_12 + +~~~ + +"Snow Biomes" Mod +By Splizard + +Download: +http//forum.minetest.net/viewtopic.php?id=2290 +http://github.com/Splizard/minetest-mod-snow/ + +--========================================================== +--============================== + + Snow Biomes + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301, USA. +]]-- + + + +-- Original Lua Files +--dofile(minetest.get_modpath("snow").."/util.lua") +--dofile(minetest.get_modpath("snow").."/mapgen.lua") +--dofile(minetest.get_modpath("snow").."/sled.lua") +-- "falling_snow.lua" disabled since weather functions minetest.get_heat(pos) and minetest.get_humidity(pos) +-- have been removed from Minetest. +-- Until something else can be figured out, use paramat's "Snowdrift" mod instead. +-- dofile(minetest.get_modpath("snow").."/falling_snow.lua") + +-- Original init.lua File Broken into Smaller Files +dofile(minetest.get_modpath("snow").."/src/abms.lua") +dofile(minetest.get_modpath("snow").."/src/aliases.lua") +dofile(minetest.get_modpath("snow").."/src/crafting.lua") +dofile(minetest.get_modpath("snow").."/src/snowball.lua") + + +-- The formspec menu didn't work when util.lua was the very first "dofile" so I moved +-- it and all the other original "dofiles", in order, to the bottom of the list. ~ LazyJ +-- Minetest would crash if the mapgen was called upon before the rest of other snow lua files so +-- I put it lower on the list and that seems to do the trick. ~ LazyJ +dofile(minetest.get_modpath("snow").."/src/util.lua") +-- To get Xmas tree saplings, the "christmas_content", true or false, in "util.lua" has to be determined first. +-- That means "nodes.lua", where the saplings are controlled, has to come after "util.lua". ~ LazyJ +dofile(minetest.get_modpath("snow").."/src/nodes.lua") +dofile(minetest.get_modpath("snow").."/src/basic_stairs_slabs.lua") +-- dofile(minetest.get_modpath("snow").."/src/mapgen.lua") +dofile(minetest.get_modpath("snow").."/src/sled.lua") +-- dofile(minetest.get_modpath("snow").."/src/falling_snow.lua") + + + +-- Check for "MoreBlocks". If not found, skip this next "dofile". + +if minetest.get_modpath("moreblocks") then + + dofile(minetest.get_modpath("snow").."/src/stairsplus.lua") + +end + +--This function places snow checking at the same time for snow level and increasing as needed. +--This also takes into account sourrounding snow and makes snow even. +function snow.place(pos) + if pos.y < -19000 then return end -- Don't put anything in the nether! + local node = minetest.get_node_or_nil(pos) + + --Oops, maybe there is no node? + if not node + or not minetest.registered_nodes[node.name] then + return + end + + local bnode = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}) + if node.name == "default:snow" then + local level = minetest.get_node_level(pos) + if level < 63 then + if minetest.get_item_group(bnode.name, "leafdecay") == 0 + and not snow.is_uneven(pos) then + minetest.sound_play("default_snow_footstep", {pos=pos}) + minetest.add_node_level(pos, 7) + end + elseif level == 63 then + local p = minetest.find_node_near(pos, 10, "default:dirt_with_grass") + if p + and minetest.get_node_light(p, 0.5) == 15 then + minetest.sound_play("default_grass_footstep", {pos=pos}) + minetest.place_node({x=pos.x, y=pos.y+1, z=pos.z}, {name="default:snow"}) + else + minetest.sound_play("default_snow_footstep", {pos=pos}) + minetest.add_node(pos, {name="default:snowblock"}) + end + end + elseif node.name ~= "default:ice" + and bnode.name ~= "air" then + local data = minetest.registered_nodes[node.name] + local drawtype = data.drawtype + if drawtype == "normal" + or drawtype == "allfaces_optional" then + pos.y = pos.y+1 + local sound = data.sounds + if sound then + sound = sound.footstep + if sound then + minetest.sound_play(sound.name, {pos=pos, gain=sound.gain}) + end + end + minetest.place_node(pos, {name="default:snow"}) + elseif drawtype == "plantlike" then + pos.y = pos.y - 1 + if minetest.get_node(pos).name == "default:dirt_with_grass" then + minetest.sound_play("default_grass_footstep", {pos=pos}) + minetest.add_node(pos, {name="default:dirt_with_snow"}) + end + end + end +end + +-- Checks if the snow level is even at any given pos. +-- Smooth Snow +local function is_uneven(pos) + local num = minetest.get_node_level(pos) + local get_node = minetest.get_node + local add_node = minetest.add_node + local found + local foundx + local foundy + local foundz + for z = -1,1 do + for x = -1,1 do + local p = {x=pos.x+x, y=pos.y, z=pos.z+z} + local node = get_node(p) + p.y = p.y-1 + local bnode = get_node(p) + + if node + and minetest.registered_nodes[node.name] + and minetest.registered_nodes[node.name].drawtype == "plantlike" + and bnode.name == "default:dirt_with_grass" then + add_node(p, {name="default:dirt_with_snow"}) + return true + end + + p.y = p.y+1 + if not (x == 0 and z == 0) + and node.name == "default:snow" + and minetest.get_node_level(p) < num then + found = true + foundx = x + foundz = z + elseif node.name == "air" + and bnode.name ~= "air" + and bnode.name ~= "default:snow" then + p.y = p.y-1 + snow.place(p) + return true + end + end + end + if found then + local p = {x=pos.x+foundx, y=pos.y, z=pos.z+foundz} + if is_uneven(p) ~= true then + minetest.add_node_level(p, 7) + end + return true + end +end + +function snow.is_uneven(pos) + if snow.smooth_snow then + return is_uneven(pos) + end +end diff --git a/mods/snow/license.txt b/mods/snow/license.txt new file mode 100755 index 00000000..94a9ed02 --- /dev/null +++ b/mods/snow/license.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/mods/snow/models/sled.blend b/mods/snow/models/sled.blend new file mode 100755 index 0000000000000000000000000000000000000000..57f4257c572603c7b6ed156c7ce7b28d901e6abd GIT binary patch literal 430048 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 + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/mods/snow/other_textures/mocha.png b/mods/snow/other_textures/mocha.png new file mode 100755 index 0000000000000000000000000000000000000000..00dd30d02e910e1c2ec5361596440f5264c3eb57 GIT binary patch literal 83 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;bAV5X>wkv-CJ&zN0&=-MT^vI= cWRn#HfgA${My}@`B0v^{r>mdKI;Vst09gSLGXMYp literal 0 HcmV?d00001 diff --git a/mods/snow/other_textures/mocha.xcf b/mods/snow/other_textures/mocha.xcf new file mode 100755 index 0000000000000000000000000000000000000000..931d90f2a4adb3ddaafca2d6f102e4637a89243c GIT binary patch literal 665 zcmaJO zHx-YX5LarJ@bTTK0Uzy&c4>&x*?*;N;_qgyL#3;FkqBKXKE8KHz+C@jIxk+9+Hzfr zxvZ()WLYik&jqP^-`YC6rSuLC!B?vg{r>bOiFi?!S(eSSQ8x%jAa!R0cATaLoH&iZ xZav-gbkEbLp6+}444U?BaSTD{5&WOAby%pKXs>>NkMp+cg&#D357-85;y1uzXzKs~ literal 0 HcmV?d00001 diff --git a/mods/snow/other_textures/original_snow_snow_brick.png b/mods/snow/other_textures/original_snow_snow_brick.png new file mode 100755 index 0000000000000000000000000000000000000000..cc9c58ee696e8c8e862ce1dbb0956eb7080bdd17 GIT binary patch literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}T7XZ8tBj1MtgMcLf`O8fk&=?J zii(-4DiE1#Xjtp$IO^#+>+8E28~d1;_?nvfSz3lzS%uozMA+I!IXNXcJ14ukrn$ML zdwJz~d*}K16!`m>hKDyqMz%ynwI(M|ynFxu`w#ztfK$=(8_>o^PZ!4!2}#z2>`u&% z0?Zo}7q%2tJG}7y_TRqKME>`h%h%sO{r>Rb`!C-rXKe9YJoVaZ6+y+OTm`QS=S(zP zAEe*fvesl`jE_)YrqeZt42O5m%ii8D+kEZu>C0cO-iJF2?+WM%6LRjjD0Z*;$OSK( rgTe~DWM4fBN%T8 literal 0 HcmV?d00001 diff --git a/mods/snow/other_textures/rect2985.png b/mods/snow/other_textures/rect2985.png new file mode 100755 index 0000000000000000000000000000000000000000..91f74ce4d8aebff43eca70db45fc4bc165922e03 GIT binary patch literal 81 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`5}q!OAr*|t1#>^#?-#Pk;gK*+ dxY7{F%pkz6B>(A#VjxfrgQu&X%Q~loCIGGE6QlqD literal 0 HcmV?d00001 diff --git a/mods/snow/other_textures/snow_ice.png b/mods/snow/other_textures/snow_ice.png new file mode 100755 index 0000000000000000000000000000000000000000..14e4f563e6a4927ee0d36bfb4361285211eea316 GIT binary patch literal 371 zcmV-(0gV2MP)hnVI~Vnf;oY{hFHoo16cfod2Dj z|DK-zpP&D%toN<0_^+?~u(15GvHh{J{<5WNFQkuRIHKF`d zs2R2shpz<*cu~Y9PP{TWv@XvDT?Loi<@O}*@i5j%>^b-}a$)$*2P&(YEfKUCsuT@1 zvD{n9OGuk*y|X#IL56Q({l?i4+bu1k@ z{U<;C@u>rA!L?|w5uv!@gF2V4c3{QXXih7`^Q$66yyzn1E z7yjew?UVfPW8O;sbGsP$S{48K#>IeWD(sR2fPB2E8f*k$_=|f8-nV+=sl)ptBdovQ z8jg>$h+$aCI6J_s$e~nnh()ZVk+P0j_k1y&q&Xvr@x+1XzGUx9dpZ+jh%;tIgCmiS zL)Nx93|aQU-2>J@V&{?jV&nUU_6`pnI(pB@!LLlNeCO2T$M0WV%{}(*nW=B(o>`rr zTYU1F?CDd}_b)&G? z!s<913XNF^QF3Isn^t!y7TkLfAxiBV>c--d`>if3ju0ik5RZ=}Q+w~QtmxqF*1fS% zqA9`;hx(%y>)m6W9<{rn5)OwV@k%)4?0U$pR>2{+aXsYD=Oi4? z^Yao8+4EWVIAqzYYNI}}yTcb`ZEc-hT9EkyfvDcaI+^NgpU~TwFRBM7q62C;*r1~# zd|JQeX)*MsBY|cO1)(u!?DPkH&E0CF5A|UBRlnNSV`yFNY9QbbnMP~S+!;+o2eyaD z#?pO>$Sx~wjrI2S4-Cck3`D}w{+Owc1;)am?Yp{7f5+HZhgS`%o&MH#f77;*s;F7E z-qmPKL?@Wfi?#JKt*J|W{oLz1>uAK<)NX%sV8=OrZbI`nV{N+H-lS^m9Mc4bq6)$>W9>l$I8 z!!DAb5g7coh=A)X0IDJjQ0^B+B>+|d0U3N6FaW3m0~mg)g(MI{KCKc6X}cEEV^u&% zSFD8+2w0p10@fyhfTfi{_^?(GJbaCDJ{aSi@p}F-2oWyp;*UYz%GX=@ZRk%T{L1l% z`BuLEB5&az_i!EKD}7WQAc64{yB2 zd;zyp^;Mtc*zpQp9V4&wf>$q`p@sjIytsPGDu5BZVjI$8FL-Q*)hq$VFJ;;zXrG`VY4np|Fm@pT#? zZ%)P+?zFpnAb2HA?dDpT6)E2pBLK@qiSxnmzDv@VWfyNbwgZ?H_HR#-_^xjkmP_a+ z3WN`aEc+MpprMdB9~z3n4nS4TCpG}M;C$Tu27r_EA#Ekjhn$r-A98lH>_2D-_78tA zicJs@N`V0x1nY&H0s$Cac1L@;T@m~>ZtsEc+V((bZfO$)2F1AK*aU&$ZNYqtn;>qO z?}c*4LsLqWhYV7$4?~u{w7IKQ+T2_f+P613BGJCoUc22#BBb`wQd1!Z?<0dm z{CFL>&pVr>ezywcp?@19Mv3|YTNZ(_;6I8ik`RFB>3^Q`on-~~UzPF+>Yo#oFXx{6 zJ1HLpSmJ!b;3R!8WZ9oL%m2Y9sTknA*aU&60t7fOcrQE^ycdYL7#{6td9&%+NZ;yXup>dp=RN^xnN$n&9I(__B*m5Tf*}6u6fS-$S z(g6bgCGAYOY4&p@b_#JP&v+!UGgp(?S!6s|pCoc&agxYIJVc0{xKR>2aib)5;>KG( z3Ca}jYZn2fhoo|nAzr3bLv_cUv6di*rWoI={kQyod>Om8G}UMQzJv`R_f zB7>xG!SJ8F&WVwtUUCSXbg!gz!f-QZgH!BuE%jZyBJe{iiJkbNm2^J*&{op2y$kam3dR^B3ow zs~qjDqIwsZ|MfiDnpJju-sfL^vbDU=r)KDeKh*i2yQ8h}+1-&wp9MJ;*910^GIh63Sx~1W0k^xMa;7Ni~hUd0UG`f DEU_-y literal 0 HcmV?d00001 diff --git a/mods/snow/other_textures/snow_snow.png b/mods/snow/other_textures/snow_snow.png new file mode 100755 index 0000000000000000000000000000000000000000..2a2439fb9ebddbb7273a05fbcda2cf4de278626b GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|u6OVMfB)e>5Jc_WaU3WZ z=IP=X!XcaN5t^8ia>6Ha#{|VAt`jCU9&~o-PLyJwurbGV6^C<&yOuO_^JHde=M}*> zOxXOEx3RJH3b=`}>9#QlvgrwSGO+PAibgr8_9*hmMJeepj>FVdQ I&MBb@0QoR5y#N3J literal 0 HcmV?d00001 diff --git a/mods/snow/other_textures/snow_snow_brick.xcf b/mods/snow/other_textures/snow_snow_brick.xcf new file mode 100755 index 0000000000000000000000000000000000000000..2fda149f196d53ef0b083f97c2e41b84dfaa1e54 GIT binary patch literal 1539 zcma)5&1)M+6xVF5e7JG!(hn%~prdneNG|;YdfyP}$>cN$mMs-7MOB@&Wov}JX>m(0wlZ2w4@!4-EmLPJuN|#q$h!79^z{XrK{x$$17~TO~{P^L}JOl7|0Yd-|@V?7g-g}V$Aj%a;v=W{C~#KSvkO2x{pknb#<^QA z@je7{xtZ5}T$-)*hYLS0l$RHm_@%}2!lQ4NOijapWq!Ga5gur!id0TJPzk?nnI;RF zoY~WGm*3Wq#$nEUu0eoI)-+93SIyN*rB=fbHcid^y3x@ zpULO>OoqQ%US2LQE<7!xGN zXM&kvK0le^Gx;E|%ava%Yijjz?D3Pe%9Gz#Y{MV`Ra7yYdSKWM)ZmPRMmyGW_H7+P zHfQ$?Ld6{e864s4hS9U_b`~2(qk(O_v4Jsxux%UrEnRnu8#z?ZNJqBQ9oU`RQvydq z_(*R<4kDXQ?1znCutA9aYzu>`Eq>S7*nqP9Isd=y8D!C3>Es{*b#WK+cXV zRZCJyQL2g}RjY+B4m;hh-t2WyhoeUwS}^D(kPM6x=m(Mm^^WA-qdpy`y~3Zg--qzY z29{Ki3RS5pDN3nYs49~D0G;%c_l8G53CF{sw2({$_^H$#_IkY*@Y?SI`2J7(U2(On xMOpcC05GqUnA%A_P)luSs&ROKz`AbFWNquuXTdPk6CUd9zP@u}^%nPowM_vwDh62^P#u%qPO#-xbvgA^Q67? zrMdH^y7Q&F^rpJ>rn~c}yYr{K^QgS^sl4>5z4WWU^sK-1uEF%M!u7$<_QTKi#?tr4 z)Az{K_sG=v%GdeL*!j=c`On(<(cJmc-1*bp`PAO|)!zEn-uc(x`q<$5+2Q)y;riU; z`r+mK;ph9}==|jB{O0QW=j{CH?ELBN{Oa!f>+byS@%``e{P6Ss@$>!k_Wt$w{`mU- z{r&%<%D5*0008PqL_t&-(*?nYLW3|A1<>cLN=+b00arnb;>3lkRxGAfBbuNU?*D&@ z=g`ml*C=dT+`7IG08}*hJSfYnoPE#Uw5jMcO6<_1#}8{eii?+ogun3w*vm_yB~Icv zAOL{@G{9MRVGUF(c>C8k`7m<<*sYZ0Zl`)$pkusvqb<>N<&g+7BJ6|%kfxF zK?hs>_pb(6WwchslzM{U(-?zIolh8Fr4gRp*3`A~Cat4@e>G<{3E5v~tpET307*qo IM6N<$g1FsCkN^Mx literal 0 HcmV?d00001 diff --git a/mods/snow/other_textures/snow_snow_cobble.xcf b/mods/snow/other_textures/snow_snow_cobble.xcf new file mode 100755 index 0000000000000000000000000000000000000000..ff2be1f16ad2cbb60922774ef0f8225c12d7fb49 GIT binary patch literal 1776 zcma)6O>7fa5cWEWL+KAxr9JiFBODS1DbVK12}F_6M%r*OmE+j1TPF^25CJR)E2Uf{u z_r5pt&D+_Xb-8={%|mvl+3EH;3~0OcLGi0N7zY1d!?EK~NW4M^;ypMT_4y4QQ@_{I z{}9f*T`1e)?zOobEv^A~4^jr)XAFCNgJ(Ssv(M{s_w3ub*Xgo*J>CKH-s;pc;Oe%S z_qVoH&D{1JsBP`T(C+^VtvNmwt1&cm$k%VPyZc<`{Rj0FNS^&SQs-Ju_qhkn?mqi_ z4j+y8I-Nep;6DeX(a%%c%(J1i4knkax7Vgu#IUEWwfzA8IyySuZfkGvIQZ7V19VR} z=F4r+G@%pqk7v(NkHcv@?HPR6?(OdOI9mJrT-42|`J9e$|}zg&lRA*Q-DYeqoxQLDWnwX+~)JXPI!`ieCm_u;dg@gusH|4eV)J6SHn zUCwF+BP=Z!zh$i}D|Z&zt$bR{Zr->S?mXFbc$9)FSzManP;XWI?yh)?9lv(<)8iau7FRP@$G)&~9DBlY zY+`9C93DT8iZ`<;Q{J?Uk6-6lgber7L^hcWU+-kQ@{rjCYgc$>7~Tw__wJxFln ztR!W+*2-K43?M(+%&lKmRahRmc#&2iRbB~%Ha5Ob`2Ua}N>Xk<7Qb+L^!?S}{gK#A zDisf299;*v;PqYh2j^#ILbM7YOo>;(e{SGBu_JwlG4gAgwM-Uj^c^7=Jzp zV&WGuHoFiC4hJp`omp60i^u2A1w+9*60JhcKQ}i&>_?a!8D5am>G<3Q|ELUN4nm`| z8ymui{}e#EoGvc};mqvqK3auz1|1jt0Q~_-q*JN%1Bl-W$dB^?{+z@}B{B8jQqT_~ z;w|`CN~HaPv+MBlh$`jt;%HhO7HJu@Cz>)-sgRNojS?eyq*N3>s;ZAmyarD+Mk^L% zIW`l$sb~?Ik#mYF3sFHKBz9|ZCL-WwlrW?m)d<0hXZZZ&6akGyi;qhsr68bWT2sne zkw@2pAP}vjYKWr3G%rj|6%++k6&^JU8VW%*3rzEflfraCQ&mjQM}cUl8I^Gm!?1OG^pZS>0_W^C1TIbceei*s`)Ag_DvGmJ8<*_TN)f$-6 zx|v!L)J}lBiGJ#->70qBiv~l5;3vpPOa_Kj7tMwS!cevmS)-u|2QGA`aoeYnQq9|; z3~4r)NE1diZ98K9P^$@}8>^aBTd5X=;4P~7eIpd0LNy(2P{sRa>1c3}pK?b-6xFTdDAmSIUy@hk38i45HwYO`Jtc0-l9^Aa~*p{}r zJqvfP?qAt9eQMw7D;FVVF#xF*8@8rRbj_a5u_m?Ps>VA%*RwFxyvZ9M8n)&)=X8XDAd9yQ`5p--XTgY$X%s5 z-_@_mD6-2eKU$Z;D_%LkS9Nh)bb+T{kfnmZiF|~mO1itgwW?@xrJ<{}bcDB7po^-h zo~Ub#N^*ccL!7mmkDfxDy;fO}Rgte*X`p3gh;@jW(#p2P7#p=q?szvutFbmpoVBm?I;T^UwuVCeIhRUF@vet^W&}@!#osl1s>TKAV;NF+w1@c~13=pL_=*5|mR)4p8;PRBs@eXsgSxvOaN1c}!=V zd$hS`j++V49$>in=_vuV1sNy-T|XhktI*Rl&)ozV0gaKa0HJwNK7jXZl>h($07*qo IM6N<$f<-l1CjbBd literal 0 HcmV?d00001 diff --git a/mods/snow/other_textures/snow_snowball.png b/mods/snow/other_textures/snow_snowball.png new file mode 100755 index 0000000000000000000000000000000000000000..2cff65a200474a8beba68e5a0dc12cbf101af32f GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Zk{fVAr*|t2YB5M)+_9&mT&aD z#$){8FS`J@lkif>6#{DnFEencU1Dfa6tLr&oXQ}>%qYn=L3Dj6LyhKK Z3ku~={bRqlhg3aHKwmOQc oX{^;>$0dCK)K-HBDfz`rJ8w+?;@|Ab0dx?9r>mdKI;Vst032gT;Q#;t literal 0 HcmV?d00001 diff --git a/mods/snow/other_textures/snow_star_lit.xcf b/mods/snow/other_textures/snow_star_lit.xcf new file mode 100755 index 0000000000000000000000000000000000000000..ecaa73c687f9e78add6d4a9eaaff49186ab6866a GIT binary patch literal 1480 zcmcIj%}x_h6h1Sh6wnHavT`vC7qF;u)96CN0u8A|p){mvnuat(nU;zDA?+Ap#ljab z@fCamoK0pP=T+V)X;2*&r%pq+kQz{gUqJ=ZD@z&F_ph03`VT@&{w zyP{2AA)aXhp(}q2^&EdE^E4c~QCZhBW-+IUM{WryH~*w`b)i>9)6&dhX3eN@d?}l) z7}l=_Ir^%~(OeGYdvHbh;1K@}SK+-8-)eACukfY5&^L`T+xbmc`T>3;8yIjo2MoF# z8{O^ULp}Uj55L~SgFSp0ob!4T0O5Kpz4PH{NG-Xd-cZALH$!5F{j6ek|Gh3 zyPU7Ne~jF*Fp489$~I62Jv?}fwZ+8<4!EDN51rQd1_k<$PjUarDehnJ+7fd_A{FP@ z#4;xmDS@piQuwvgg6MfvaR1@NG)1GdBm{an6XDs}SR9_{e<~Rl3Bmm@N5U!YKblO7 znKbu5lTI$jV-M4axzLjW1usO5^EGGV$UTbb6Ud6PNt99P#~^r1B&UgVfm!N^=zn;8 zXE>b4cZS9pB4-46kh~%54x=}o!%Ifq$XI5nsLkt@mu&N<+xuBt(EZEL;&02b{QEe) j4}f@|gw?M2--37@K<|I=8eE~wb@T33&%F?AFt&Y?KF!qv$}lYUMph0FEZ+EqPVyX{s)<_r;Hi4!4k^wYLQzlJ~s zN5jmC-1AZ!0cjRasyL3bzlIf)0wU`BZBdkaYi$-GxX;~ThKPx5l(MG|6pqRYk+fOW zhkiB%C1tbmeLu;aljHdV(ERa~Rz$y1#vjHYkP*#PIu|j;vC(&6&AaahT7O9lLzQT7 vn`#{5O&7AxT?eU63lEn|bt11@y}bPclkR)*5Yb3e00000NkvXXu0mjfM<9P7 literal 0 HcmV?d00001 diff --git a/mods/snow/other_textures/xdefault_furnace_bottom.png b/mods/snow/other_textures/xdefault_furnace_bottom.png new file mode 100755 index 0000000000000000000000000000000000000000..e8191f7b3bd985cb05125f91c37704d534fe6fa9 GIT binary patch literal 602 zcmV-g0;Tr+hRpEcog^nGXL*vi z_3dYQTHVNx<+c1=-^#Deovfx8rp47q8@IEsvc0>s_3U!Y+_b*=B(58U61H2?JBg&< zjpgLHBayCKwW>URn@YVLNE{wZtakR<;|vrM?Q5b*&rjnxa zsFaFasjt)mM4h&c4nT-!Nj8E}L8DxdoVIhI_ie3ZGm=ZEm>cATzL(wCuf#!;8$e_r z&}KH_`skH_{0YCNN=81G$wAyeTAz`OheMfOoJyxrGkY9{;*-4mH(WnWc9rZM!Ny_&pYn(_%o@zs-4*f+mky7Qok9kYN0@0pMXsSyhgbtfLEkD0YS>+`}D zHy7xfC^$8vdBObuiyv$I{o!#xQz;SGE@fELHMx29!Ivo|W`5Hj2^`VtbJtzw#Koh~ zqglYHrX~{6!t0Rs;JVKZhN8pF!4s62KkViZW?;x@S~2}e%7ckO=P`J?`njxgN@xNA D>_^k7{-tEA@4a-Q#LPYHf)ku4Vky{(u%x=p>(lSEXe4h5q(fJC`|~VK9o=ylo^T< zMkGNAWtR6qqbrsrWm6K=>E@Q!FZUlfh6WvYIPZDh^Zw5B;fViPCEo6mmhf3*rZ@@y z1!@X*w8*}H$jjBvs9!61u35F<#mF2jLMwBk%y+q%7iZ)yVqVre6+RAjfJ)gi+GFJu z1vs-$=CLTv)j&7Vutt)#*P-?x-^)rn;NwAUs3)8Zp=YBN+^ll9h}Sy;rStt@ndsi= zXd@1#crJQnDqG3OZUt`=R`4Rym7kd#EVY=g#e6OF2mCE!qCkn@TsY$eK};X?V<_DQ z)90;QsQcpFn9L4Bm*FFM<{~8@v@4+~6fwF-A(_7ll?-Gkm?*YJeZAR9+GkFz=4-k) zQ@L{Hio+z2i?J9=BQVy*+tLrFx??yW2HlZ-+U3SXzFca~R>wiPhHp7u7~0lb0oRp` zK2b7xA;bn4$#O$q6Am}GU~J#SaH#?wB}2_N%t!q&SB1m-1nAPzpDDnQ%vht34KRIJ zjxjHQxwbg^YFzl!nj|%OtHp3FobL}*@H7cyMI}ksMmm z-O(M|ir}4w-YfplodqAYP@!U`GYQ7`!>uTIrG?&HMlXkAx}?E$H=f2w2TFWhIqvO@ zxE(LxSsKPl72HcjR~wAEX{TMHV!0Qmy&VxttiRk$lS~JSPO|_2002ovPDHLkV1hsR BPGA54 literal 0 HcmV?d00001 diff --git a/mods/snow/other_textures/xdefault_furnace_front.png b/mods/snow/other_textures/xdefault_furnace_front.png new file mode 100755 index 0000000000000000000000000000000000000000..cbc21c6e41b260ac4ba858d7da5a2520c50cc1f3 GIT binary patch literal 553 zcmV+^0@nSBP)29d`S!}*SuBks+>HkKd4Gw`Ji}HuM>F&>I@v?qaQQoHMwnioBlcVbwuLN-adp;5 z8iimU6_PN(WO#_cvEdmSTtmUIzk%4dpo?Yrbsaw@0|cH8o4#M2_6eFGYWQH5QG@T8 z$kQ0JZ|Bg2BGlC-+jbo3%o|3zo+|+JQMYAol8rJQGY4 z-=ikc=GT_y0tB`K-%`QuFZS^;+MU}$x8z1Q5ikBIJ36F)~xv^2D^ z-n8*BKETepO1sgpnX2eC6|(z*rdnu)JfW0S4*{i<9i) literal 0 HcmV?d00001 diff --git a/mods/snow/other_textures/xdefault_furnace_front_active.png b/mods/snow/other_textures/xdefault_furnace_front_active.png new file mode 100755 index 0000000000000000000000000000000000000000..d103606e3ff9dc3db7e613178c45540dbadacdce GIT binary patch literal 4277 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¿Y)`6dP_g^o zdh<+My>;;ob-K%H7EC%aw&OQ+Fl~*d&*fI1&I1aKN{_m>Dv;3de|l>)!3od*O%qdOfq2+BnJHROf9jLY z-;A^i=!^#fGX_o{W=JC=Xy%(?C;~?yq8Yjdrq@f3r$I`%XkH>Q!(%sqfn;Skzqx#5 zY(Ue2qUwS;y}xv*^PRlvont!jBLICUV^b*=ns*}f!pN% zW3fbip=EAGfzu+B1ukJQ#%DzpwH7X{dw8b=9HkffgOLd~q)snuwVI__SxS)kJ^)jm(+r zr;7^|{j?rNV}k?lbhTHsEa!6PJRs00v*ecghdTnUBZ5=`ELH7@3;OZ XxIRp2`j8vv00000NkvXXu0mjfHknT* literal 0 HcmV?d00001 diff --git a/mods/snow/other_textures/xdefault_furnace_side.png b/mods/snow/other_textures/xdefault_furnace_side.png new file mode 100755 index 0000000000000000000000000000000000000000..e8191f7b3bd985cb05125f91c37704d534fe6fa9 GIT binary patch literal 602 zcmV-g0;Tr+hRpEcog^nGXL*vi z_3dYQTHVNx<+c1=-^#Deovfx8rp47q8@IEsvc0>s_3U!Y+_b*=B(58U61H2?JBg&< zjpgLHBayCKwW>URn@YVLNE{wZtakR<;|vrM?Q5b*&rjnxa zsFaFasjt)mM4h&c4nT-!Nj8E}L8DxdoVIhI_ie3ZGm=ZEm>cATzL(wCuf#!;8$e_r z&}KH_`skH_{0YCNN=81G$wAyeTAz`OheMfOoJyxrGkY9{;*-4mH(Wnr+hRpEcog^nGXL*vi z_3dYQTHVNx<+c1=-^#Deovfx8rp47q8@IEsvc0>s_3U!Y+_b*=B(58U61H2?JBg&< zjpgLHBayCKwW>URn@YVLNE{wZtakR<;|vrM?Q5b*&rjnxa zsFaFasjt)mM4h&c4nT-!Nj8E}L8DxdoVIhI_ie3ZGm=ZEm>cATzL(wCuf#!;8$e_r z&}KH_`skH_{0YCNN=81G$wAyeTAz`OheMfOoJyxrGkY9{;*-4mH(WnhnVI~Vnf;oY{hFHoo16cfod2Dj z|DK-zpP&D%toN<0_^+?~u(15GvHh{J{<5WNFQkuRIHKF`d zs2R2shpz<*cu~Y9PP{TWv@XvDT?Loi<@O}*@i5j%>^b-}a$)$*2P&(YEfKUCsuT@1 z2Iuy&H2wf6-; zw6r<%08uMI#Lof9j*~d{G81e_Rm2l8_GG{P_WNchW7FE*GY-pDqiWSE1&rk^39n#k z8vfkJTzvL%{Dczm1I+7~I_9GclkOqvALF`gV%eg#TQVy}bKlxVs(|NOVYS&hs#T0; zqh@WdEv;6~a--JRH&$m$ao^l38Jp`HvoJQUfc$6;ty}-H=E6V4a)zvj&An3Ds+-2< z)9eZ)kN!qxT=Af8wG69X-l;Un->6obmDcYD$$gdj#ay=19J0{f>&2$;tOa9}z+hQ7o40{ph@w1L|ofenBkvo`p^ zd!7xp5A74-%072UB0mT?=e+$17z{YLpFJ430KG0a7aim@cwMmHF(FPx7v6&-1@FA| zfSoabQ`dI=E?fxK9taM77fVTy9yniI2k=_vOUVGc=>QBE6Fx8>Wapgj0^#;NI05On zZ5Mll?wKP`I0(mfu@NgQ85QeA=@lm4`cjF+9NOev92-9>tRwPs^RyWir zQNv-3gr*Yo>*`yA{79)Jjug^FeaAYnid2X+UXIdqh_&L;R1L|O%qUW(6WnV70;1wc wi0TCu;aw5dBrcpHOo$+>mc&>yz&^$k>@|$Y6~qBGorJ`vQ-p=|l~zzc0rkg+_5c6? literal 0 HcmV?d00001 diff --git a/mods/snow/other_textures/xdefault_snow.png b/mods/snow/other_textures/xdefault_snow.png new file mode 100755 index 0000000000000000000000000000000000000000..2a2439fb9ebddbb7273a05fbcda2cf4de278626b GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|u6OVMfB)e>5Jc_WaU3WZ z=IP=X!XcaN5t^8ia>6Ha#{|VAt`jCU9&~o-PLyJwurbGV6^C<&yOuO_^JHde=M}*> zOxXOEx3RJH3b=`}>9#QlvgrwSGO+PAibgr8_9*hmMJeepj>FVdQ I&MBb@0QoR5y#N3J literal 0 HcmV?d00001 diff --git a/mods/snow/other_textures/xdefault_stone_brick.png b/mods/snow/other_textures/xdefault_stone_brick.png new file mode 100755 index 0000000000000000000000000000000000000000..7958330d1ce2709a346e7d73a5097952115e6525 GIT binary patch literal 572 zcmV-C0>k}@P)jb|pW<>3|oLzp2aQS(toSlUHR^~T2e|rm^)&V|E z#yFi$aNIl8b@=`rX5$fhZ@S7f8e%$%FcY}n58vW?@dNIDDut5g;ZZJ2Xe&>=B5FHj zRLjp|#18hGXbbh-3I>NEzK!|}kVHW)Ze}xj>3MZm9Z0RR15YaSNpTx>`Q|?TTFuvS zfLwY*H!ZVeCk()>Tw>1JNh?_#w7M1B&dDt1IfKc_)#6b@fwwD!f zHEj&5+}&AP(!Trow5~Q6oQJhUf)(hRO04oseb&S-Z02!K_WuIWDr_w}U>cqP0000< KMNUMnLSTYKXb0Q? literal 0 HcmV?d00001 diff --git a/mods/snow/readme.txt b/mods/snow/readme.txt new file mode 100755 index 00000000..13013b40 --- /dev/null +++ b/mods/snow/readme.txt @@ -0,0 +1,103 @@ + _____ __ __ _ + / ____| | \/ | | | + | (___ _ __ _____ __ | \ / | ___ __| | + \___ \| '_ \ / _ \ \ /\ / / | |\/| |/ _ \ / _` | + ____) | | | | (_) \ V V / | | | | (_) | (_| | + |_____/|_| |_|\___/ \_/\_/ |_| |_|\___/ \__,_| + + Version 3.2 + +By Splizard and LazyJ. + +Minetest version: 0.4.9 +Depends: default +License: GPL v2 + +Complimentary Mods: +--------------------- +* "Snowdrift" by paramat +* "More Blocks" by Calinou (2014_05_11 or newer) +* "Skins" by Zeg9 + + +Install: + +Forum post: http://minetest.net/forum/viewtopic.php?id=2290 +Github: https://github.com/Splizard/minetest-mod-snow +Website: http://splizard.com/minetest/mods/snow/ + +INSTALL: +---------- +Place this folder in your minetest mods folder. +(http://dev.minetest.net/Installing_Mods) + + * After downloading, unzip the file. + * Rename the directory "minetest-mod-snow-master" to "snow" + * Copy the "snow" directory into either + ../minetest/worlds/yourworld'sname/worldmods/ + or + ../minetest/mods/ + * If you put "snow" in the ../minetest/mods/ directory, either + enable the mod from within Minetest's "Configure" button + (main menu, bottom right) or by adding this line to the + world's "world.mt" file: + load_mod_snow = true + + + +NOTICE +While this mod is installed you may experience slower map loading while a snow biome is generated. + +USAGE: +------- +If you walk around a bit you will find snow biomes scattered around the world. + +There are nine biome types: +* Normal +* Icebergs +* Icesheet +* Broken icesheet +* Icecave +* Coast +* Alpine +* Snowy +* Plain + +Snow can be picked up and thrown as snowballs or stacked into snow blocks. +Snow and ice melts when near warm blocks such as torches or igniters such as lava. +Snow blocks freeze water source blocks around them. +Moss can be found in the snow, when moss is placed near cobble it spreads. +Christmas trees can be found when digging pine needles. +Sleds allow for faster travel on snow. + +CRAFTING: +----------- +Snow Brick: + +Snow Block Snow Block +Snow Block Snow Block + +Sled: + Stick +Wood Wood Wood + +Icy Snow: + +Snow Ice +Ice Snow + +MAPGEN_V7: +------------ +If you are using minetest 0.4.8 or the latest dev version of minetest you can choose to generate a v7 map. +This option can be found when creating a new map from the menu. +Snow Biomes has support for this though you might need a couple other biomes too otherwise you will only spawn snow. +There are a couple of bugs and limitations with this such as no ice being generated at the moment. + +Config file: +------------ +After starting a game in minetest with snow mod, a config file will be placed in this folder that contains the various options for snow mod. +As admin you can use the /snow command in-game to make various changes. + +UNINSTALL: +------------ +Simply delete the folder snow from the mods folder. diff --git a/mods/snow/schematics/pine.mts b/mods/snow/schematics/pine.mts new file mode 100755 index 0000000000000000000000000000000000000000..cf09cd8670c7618ad1a3d1311ea81d6e9be0028c GIT binary patch literal 99 zcmeYb3HD`R20{)7=KoLt;wNSnG4K@U<(FIKrKYCjq!u#>q@<=LmgbaL6=de6mK3F? uR?JCGaA4~3n84VRsG^p@blR}->Y~Xzz6d4$tJh+bS*Iq+z|i)>{Vo7A? 0 then + for l = 0,1 do + for i = -1,1,2 do + for _,p in pairs({ + {x=pos.x+i, z=pos.z-l*i}, + {x=pos.x+l*i, z=pos.z+i} + }) do + if math.random(2) == 2 then + p.y = pos.y + if minetest.get_node(p).name == "default:water_source" then + minetest.add_node(p,{name="default:ice", param2 = math.random(0,node.param2-1)}) + end + end + end + end + end + if math.random(8) == 8 then + minetest.add_node(pos, {name="default:water_source"}) + else + minetest.add_node(pos, {name="default:ice", param2 = 0}) + end + end + end, +}) + + + +--Spread moss to cobble. +minetest.register_abm({ + nodenames = {"default:cobble"}, + neighbors = {"snow:moss"}, + interval = 20, + chance = 6, + action = function(pos, node) + node.name = "default:mossycobble" + minetest.add_node(pos, node) + end, +}) + + + + +--Grow Pine Saplings +minetest.register_abm({ + nodenames = {"snow:sapling_pine"}, + interval = 10, + chance = 50, + action = function(pos, node) + +-- Check if there is enough vertical-space for the sapling to grow without +-- hitting anything else. ~ LazyJ, 2014_04_10 + + -- 'If' there is air in each of the 8 nodes dirctly above the sapling,... ~LazyJ + for i = 1,8 do + if minetest.get_node({x=pos.x, y=pos.y+i, z=pos.z}).name ~= "air" then + return + end + end + -- 'then' let the sapling grow into a tree. ~ LazyJ + + snow.make_pine(pos,false) + -- This finds the sapling under the grown tree. ~ LazyJ + if minetest.get_node(pos).name == "snow:sapling_pine" then + -- This switches the sapling to a tree trunk. ~ LazyJ + minetest.set_node(pos, {name="default:pinetree"}) + -- This is more for testing but it may be useful info to some admins when + -- grepping the server logs too. ~ LazyJ + minetest.log("action", "A pine sapling grows into a tree at "..minetest.pos_to_string(pos)) + end + end +}) + + + + +--Grow Christmas Tree Saplings +minetest.register_abm({ + nodenames = {"snow:xmas_tree"}, + interval = 10, + chance = 50, + action = function(pos, node) + + -- 'If' there is air in each of the 8 nodes dirctly above the sapling,... ~LazyJ + for i = 1,8 do + if minetest.get_node({x=pos.x, y=pos.y+i, z=pos.z}).name ~= "air" then + return + end + end + -- 'then' let the sapling grow into a tree. ~ LazyJ + + snow.make_pine(pos,false,true) + minetest.log("action", "A pine sapling grows into a Christmas tree at "..minetest.pos_to_string(pos)) -- ~ LazyJ + --else -- 'Else', if there isn't air in each of the 8 nodes above the sapling, + -- then don't anything; including not allowing the sapling to grow. + -- ~ LazyJ, 2014_04_10 + --end + end +}) diff --git a/mods/snow/src/aliases.lua b/mods/snow/src/aliases.lua new file mode 100755 index 00000000..3cee7b12 --- /dev/null +++ b/mods/snow/src/aliases.lua @@ -0,0 +1,104 @@ +-- Some aliases for compatibility switches and some to make "/give" commands +-- a little easier + +minetest.register_alias("snow:snow", "default:snow") +minetest.register_alias("default_snow", "default:snow") +minetest.register_alias("snow:snowball", "default:snow") +minetest.register_alias("snowball", "default:snow") +minetest.register_alias("snowballs", "default:snow") +minetest.register_alias("snow_ball", "default:snow") +minetest.register_alias("snow:ice", "default:ice") +minetest.register_alias("ice", "default:ice") +minetest.register_alias("default_ice", "default:ice") +minetest.register_alias("snow:dirt_with_snow", "default:dirt_with_snow") +minetest.register_alias("dirtwithsnow", "default:dirt_with_snow") +minetest.register_alias("snowdirt", "default:dirt_with_snow") +minetest.register_alias("snowydirt", "default:dirt_with_snow") +minetest.register_alias("snow:snow_block", "default:snowblock") +minetest.register_alias("default:snow_block", "default:snowblock") +minetest.register_alias("snowblocks", "default:snowblock") +minetest.register_alias("snowbrick", "snow:snow_brick") +minetest.register_alias("bricksnow", "snow:snow_brick") +minetest.register_alias("snowbricks", "snow:snow_brick") +minetest.register_alias("snowybricks", "snow:snow_brick") +minetest.register_alias("icysnow", "snow:snow_cobble") +minetest.register_alias("snowcobble", "snow:snow_cobble") +minetest.register_alias("snowycobble", "snow:snow_cobble") +minetest.register_alias("cobblesnow", "snow:snow_cobble") + + +-- To clean up my first stairsplus attempt. +-- Stair +minetest.register_alias(":default:stair_snowblock", "moreblocks:stair_snowblock") +minetest.register_alias(":default:stair_snowblock_half", "moreblocks:stair_snowblock_half") +minetest.register_alias(":default:stair_snowblock_right_half", "moreblocks:stair_snowblock_right_half") +minetest.register_alias(":default:stair_snowblock_inner", "moreblocks:stair_snowblock_inner") +minetest.register_alias(":default:stair_snowblock_outer", "moreblocks:stair_snowblock_outer") +minetest.register_alias(":default:stair_snowblock_alt", "moreblocks:stair_snowblock_alt") +minetest.register_alias(":default:stair_snowblock_alt_1", "moreblocks:stair_snowblock_alt_1") +minetest.register_alias(":default:stair_snowblock_alt_2", "moreblocks:stair_snowblock_2") +minetest.register_alias(":default:stair_snowblock_alt_4", "moreblocks:stair_snowblock_alt_4") + +minetest.register_alias(":default:stair_ice", "moreblocks:stair_ice") +minetest.register_alias(":default:stair_ice_half", "moreblocks:stair_ice_half") +minetest.register_alias(":default:stair_ice_right_half", "moreblocks:stair_ice_right_half") +minetest.register_alias(":default:stair_ice_inner", "moreblocks:stair_ice_inner") +minetest.register_alias(":default:stair_ice_outer", "moreblocks:stair_ice_outer") +minetest.register_alias(":default:stair_ice_alt", "moreblocks:stair_ice_alt") +minetest.register_alias(":default:stair_ice_alt_1", "moreblocks:stair_ice_alt_1") +minetest.register_alias(":default:stair_ice_alt_2", "moreblocks:stair_ice_2") +minetest.register_alias(":default:stair_ice_alt_4", "moreblocks:stair_ice_alt_4") + + +-- Slab +minetest.register_alias(":default:slab_snowblock", "moreblocks:slab_snowblock") +minetest.register_alias(":default:slab_snowblock_quarter", "moreblocks:slab_snowblock_quarter") +minetest.register_alias(":default:slab_snowblock_three_quarter", "moreblocks:slab_snowblock_three_quarter") +minetest.register_alias(":default:slab_snowblock_1", "moreblocks:slab_snowblock_1") +minetest.register_alias(":default:slab_snowblock_2", "moreblocks:slab_snowblock_2") +minetest.register_alias(":default:slab_snowblock_14", "moreblocks:slab_snowblock_14") +minetest.register_alias(":default:slab_snowblock_15", "moreblocks:slab_snowblock_15") + +minetest.register_alias(":default:slab_ice", "moreblocks:slab_ice") +minetest.register_alias(":default:slab_ice_quarter", "moreblocks:slab_ice_quarter") +minetest.register_alias(":default:slab_ice_three_quarter", "moreblocks:slab_ice_three_quarter") +minetest.register_alias(":default:slab_ice_1", "moreblocks:slab_ice_1") +minetest.register_alias(":default:slab_ice_2", "moreblocks:slab_ice_2") +minetest.register_alias(":default:slab_ice_14", "moreblocks:slab_ice_14") +minetest.register_alias(":default:slab_ice_15", "moreblocks:slab_ice_15") + + +-- Panel +minetest.register_alias(":default:panel_snowblock", "moreblocks:panel_snowblock") +minetest.register_alias(":default:panel_snowblock_1", "moreblocks:panel_snowblock_1") +minetest.register_alias(":default:panel_snowblock_2", "moreblocks:panel_snowblock_2") +minetest.register_alias(":default:panel_snowblock_4", "moreblocks:panel_snowblock_4") +minetest.register_alias(":default:panel_snowblock_12", "moreblocks:panel_snowblock_12") +minetest.register_alias(":default:panel_snowblock_14", "moreblocks:panel_snowblock_14") +minetest.register_alias(":default:panel_snowblock_15", "moreblocks:panel_snowblock_15") + +minetest.register_alias(":default:panel_ice", "moreblocks:panel_ice") +minetest.register_alias(":default:panel_ice_1", "moreblocks:panel_ice_1") +minetest.register_alias(":default:panel_ice_2", "moreblocks:panel_ice_2") +minetest.register_alias(":default:panel_ice_4", "moreblocks:panel_ice_4") +minetest.register_alias(":default:panel_ice_12", "moreblocks:panel_ice_12") +minetest.register_alias(":default:panel_ice_14", "moreblocks:panel_ice_14") +minetest.register_alias(":default:panel_ice_15", "moreblocks:panel_ice_15") + + +-- Micro +minetest.register_alias(":default:micro_snowblock", "moreblocks:micro_snowblock") +minetest.register_alias(":default:micro_snowblock_1", "moreblocks:micro_snowblock_1") +minetest.register_alias(":default:micro_snowblock_2", "moreblocks:micro_snowblock_2") +minetest.register_alias(":default:micro_snowblock_4", "moreblocks:micro_snowblock_4") +minetest.register_alias(":default:micro_snowblock_12", "moreblocks:micro_snowblock_12") +minetest.register_alias(":default:micro_snowblock_14", "moreblocks:micro_snowblock_14") +minetest.register_alias(":default:micro_snowblock_15", "moreblocks:micro_snowblock_15") + +minetest.register_alias(":default:micro_ice", "moreblocks:micro_ice") +minetest.register_alias(":default:micro_ice_1", "moreblocks:micro_ice_1") +minetest.register_alias(":default:micro_ice_2", "moreblocks:micro_ice_2") +minetest.register_alias(":default:micro_ice_4", "moreblocks:micro_ice_4") +minetest.register_alias(":default:micro_ice_12", "moreblocks:micro_ice_12") +minetest.register_alias(":default:micro_ice_14", "moreblocks:micro_ice_14") +minetest.register_alias(":default:micro_ice_15", "moreblocks:micro_ice_15") diff --git a/mods/snow/src/basic_stairs_slabs.lua b/mods/snow/src/basic_stairs_slabs.lua new file mode 100755 index 00000000..6cb67d1a --- /dev/null +++ b/mods/snow/src/basic_stairs_slabs.lua @@ -0,0 +1,302 @@ +-- Based on +-- Minetest 0.4 mod: stairs +-- See README.txt for licensing and other information. + + +-- ADD CHECK FOR MOREBLOCKS/SKIP IF NOT FOUND CODE STUFF HERE + + +-- what of the recipeitem can be copied +local recipe_values = { + "description", "tiles", "groups", "sounds", "use_texture_alpha", "sunlight_propagates", + "freezemelt", "liquidtype", "sunlight_propagates", + "stair_desc", "slab_desc" +} + +local stairdef = { + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = true, + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_snow_footstep", gain=0.25}, + dig = {name="default_dig_crumbly", gain=0.4}, + dug = {name="default_snow_footstep", gain=0.75}, + place = {name="default_place_node", gain=1.0} + }), + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + {-0.5, 0, 0, 0.5, 0.5, 0.5}, + }, + }, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + local p0 = pointed_thing.under + local p1 = pointed_thing.above + local param2 = 0 + + local placer_pos = placer:getpos() + if placer_pos then + local dir = { + x = p1.x - placer_pos.x, + y = p1.y - placer_pos.y, + z = p1.z - placer_pos.z + } + param2 = minetest.dir_to_facedir(dir) + end + + if p0.y-1 == p1.y then + param2 = param2 + 20 + if param2 == 21 then + param2 = 23 + elseif param2 == 23 then + param2 = 21 + end + end + + return minetest.item_place(itemstack, placer, pointed_thing, param2) + end, + + on_construct = function(pos) + pos.y = pos.y - 1 + local node = minetest.get_node(pos) + if node.name == "default:dirt_with_grass" + -- Thinking in terms of layers, dirt_with_snow could also double as + -- dirt_with_frost which adds subtlety to the winterscape. ~ LazyJ, 2014_04_04 + or node.name == "default:dirt" then + node.name = "default:dirt_with_snow" + minetest.set_node(pos, node) + end + end +} + +-- Node will be called snow:stair_ +local function register_stair(subname, recipeitem, newdef) + local def = table.copy(stairdef) + + + for n,i in pairs(newdef) do + def[n] = i + end + + local name = "snow:stair_" .. subname + minetest.register_node(name, def) +--[[ + -- for replace ABM + minetest.register_node("snow:stair_" .. subname.."upside_down", { + replace_name = "snow:stair_" .. subname, + groups = {slabs_replace=1}, + }) +--]] + minetest.register_craft({ + output = name .. " 6", + recipe = { + {recipeitem, "", ""}, + {recipeitem, recipeitem, ""}, + {recipeitem, recipeitem, recipeitem}, + }, + }) + + -- Flipped recipe + minetest.register_craft({ + output = name .. " 6", + recipe = { + {"", "", recipeitem}, + {"", recipeitem, recipeitem}, + {recipeitem, recipeitem, recipeitem}, + }, + }) +end + + +local slabdef = table.copy(stairdef) +slabdef.node_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, +} +slabdef.on_place = nil + +-- Node will be called snow:slab_ +local function register_slab(subname, recipeitem, newdef) + local def = table.copy(slabdef) + + local name = "snow:slab_" .. subname + def.on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + -- If it's being placed on an another similar one, replace it with + -- a full block + local slabpos, slabnode + local p0 = pointed_thing.under + local p1 = pointed_thing.above + local n0 = minetest.get_node(p0) + local n1 = minetest.get_node(p1) + + local n0_is_upside_down = (n0.name == name and + n0.param2 >= 20) + + if n0.name == name + and not n0_is_upside_down + and p0.y+1 == p1.y then + slabpos = p0 + slabnode = n0 + elseif n1.name == name then + slabpos = p1 + slabnode = n1 + end + if slabpos then + -- Remove the slab at slabpos + minetest.remove_node(slabpos) + -- Make a fake stack of a single item and try to place it + local fakestack = ItemStack(recipeitem) + fakestack:set_count(itemstack:get_count()) + + pointed_thing.above = slabpos + local success + fakestack, success = minetest.item_place(fakestack, placer, pointed_thing) + -- If the item was taken from the fake stack, decrement original + if success then + itemstack:set_count(fakestack:get_count()) + -- Else put old node back + else + minetest.set_node(slabpos, slabnode) + end + return itemstack + end + + local param2 + -- Upside down slabs + if p0.y-1 == p1.y then + -- Turn into full block if pointing at a existing slab + if n0_is_upside_down then + -- Remove the slab at the position of the slab + minetest.remove_node(p0) + -- Make a fake stack of a single item and try to place it + local fakestack = ItemStack(recipeitem) + fakestack:set_count(itemstack:get_count()) + + pointed_thing.above = p0 + local success + fakestack, success = minetest.item_place(fakestack, placer, pointed_thing) + -- If the item was taken from the fake stack, decrement original + if success then + itemstack:set_count(fakestack:get_count()) + -- Else put old node back + else + minetest.set_node(p0, n0) + end + return itemstack + end + + -- Place upside down slab + param2 = 20 + elseif n0_is_upside_down + and p0.y+1 ~= p1.y then + -- If pointing at the side of a upside down slab + param2 = 20 + end + + return minetest.item_place(itemstack, placer, pointed_thing, param2) + end + + for n,i in pairs(newdef) do + def[n] = i + end + + minetest.register_node(name, def) +--[[ + -- for replace ABM + minetest.register_node("snow:slab_" .. subname.."upside_down", { + replace_name = "snow:slab_"..subname, + groups = {slabs_replace=1}, + }) +--]] + + minetest.register_craft({ + output = name .. " 6", + recipe = { + {recipeitem, recipeitem, recipeitem}, + }, + }) + + + + +end +--[[ +-- Replace old "upside_down" nodes with new param2 versions +minetest.register_abm({ + nodenames = {"group:slabs_replace"}, + interval = 1, + chance = 1, + action = function(pos, node) + node.name = minetest.registered_nodes[node.name].replace_name + node.param2 = node.param2 + 20 + if node.param2 == 21 then + node.param2 = 23 + elseif node.param2 == 23 then + node.param2 = 21 + end + minetest.set_node(pos, node) + end, +}) +--]] + + + +-- Snow stairs and slabs require extra definitions because of their extra +-- features (freezing, melting, and how they change dirt and dirt_with_grass). ~ LazyJ + +-- Nodes will be called snow:{stair,slab}_ +local function register_stair_and_slab(subname, recipeitem, def) + local recipedef = minetest.registered_nodes[recipeitem] + for _,i in pairs(recipe_values) do + if def[i] == nil + and recipedef[i] ~= nil then + def[i] = recipedef[i] + end + end + local groups = table.copy(def.groups) + groups.cooks_into_ice = nil + if groups.melts then + groups.melts = math.min(groups.melts+1, 3) + end + def.groups = groups + + local stair_desc = def.stair_desc + def.stair_desc = nil + local slab_desc = def.slab_desc + def.slab_desc = nil + + def.description = stair_desc + register_stair(subname, recipeitem, def) + + def.description = slab_desc + register_slab(subname, recipeitem, def) +end + + +list_of_snow_stuff = { + --{"row[1] = first item in row", + -- "row[2] = second item in row", + -- "row[3] = third item in row", and so on, and so on...}, ~ LazyJ + {"ice", "default:ice", "Ice Stairs", "Ice Slabs"}, + {"snowblock", "default:snowblock", "Snowblock Stairs", "Snowblock Slabs"}, + {"snow_cobble", "snow:snow_cobble", "Snow Cobble Stairs", "Snow Cobble Slabs"}, + {"snow_brick", "snow:snow_brick", "Snow Brick Stair", "Snow Brick Slab"}, + {"ice_brick", "snow:ice_brick", "Ice Brick Stair", "Ice Brick Slab"}, +} + +for _, row in pairs(list_of_snow_stuff) do + register_stair_and_slab(row[1], row[2], { + stair_desc = row[3], + slab_desc = row[4], + }) +end diff --git a/mods/snow/src/crafting.lua b/mods/snow/src/crafting.lua new file mode 100755 index 00000000..d1735151 --- /dev/null +++ b/mods/snow/src/crafting.lua @@ -0,0 +1,216 @@ +--[[ + +Crafting Sections (in order, top to bottom): + 1. Cooking + 2. Crafting and Recycling + +The crafting recipe for the sled is in the sled.lua file. + +~ LazyJ + +]] + + +-- 1. Cooking + +--[[ +"Cooks_into_ice" is a custom group I assigned to full-sized, snow-stuff nodes +(snow bricks, snow cobble, snow blocks, etc.) so I wouldn't have to write an individual cooking +recipe for each one. + +~ LazyJ +]] + +minetest.register_craft({ + type = "cooking", + cooktime = 12, + output = "default:ice", + recipe = "group:cooks_into_ice", +}) + + + + + + +-- 2. Crafting and Recycling + +-- Let's make moss craftable so players can more easily create mossycobble and +-- gives another useful purpose to pine needles. ~ LazyJ + +minetest.register_craft({ + output = "snow:moss", + recipe = { + {"snow:needles", "snow:needles"}, + {"snow:needles", "snow:needles"}, + }, +}) + + +--[[ +Most snow biomes are too small to provide enough snow as a building material and +still have enough landscape snow to create the wintry surroundings of a +snow village or castle. So I added this snowblock crafting recipe as a way for +players to increase their snow supply in small increments. I considered making +the output 9 but that would make it all too quick and easy (especially for griefers) to create lots +of snowblocks (and then use them to water-grief by melting the snow blocks). + +~ LazyJ + +--]] + +minetest.register_craft({ + type = "shapeless", + output = "default:snowblock 2", + recipe = { + "snow:snow_cobble", + "snow:snow_cobble" + } +}) + + + +--[[minetest.register_craft({ + type = "shapeless", + output = "default:snowblock 3", + recipe = { + "default:snowblock", + "default:snowblock" + } +})]] + + + +minetest.register_craft({ + output = "snow:snow_brick", + recipe = { + {"default:snowblock", "default:snowblock"}, + {"default:snowblock", "default:snowblock"} + } +}) + +-- Why not recycle snow_bricks back into snowblocks? ~ LazyJ +minetest.register_craft({ + output = "default:snowblock 4", + recipe = { + {"snow:snow_brick"} + } +}) + + +minetest.register_craft({ + output = "snow:ice_brick", + recipe = { + {"default:ice", "default:ice"}, + {"default:ice", "default:ice"} + } +}) + +minetest.register_craft({ + output = "snow:snow_cobble 6", + recipe = { + {"snow:ice_brick"} + } +}) + + +--Craft icy snow. +minetest.register_craft({ + type = "shapeless", + output = "snow:snow_cobble 6", + recipe = { + "default:snow", + "default:snow", + "default:snow", + "default:snow", + "default:snow", + "default:snow", + "default:ice", + "default:ice", + "default:ice" + } +}) + + +minetest.register_craft({ + type = "shapeless", + output = "snow:snow_cobble 4", + recipe = { + "default:snow", + "default:snow", + "default:snow", + "default:snow", + "default:ice", + "default:ice" + } +}) + +minetest.register_craft({ + type = "shapeless", + output = "snow:snow_cobble 2", + recipe = { + "default:snow", + "default:snow", + "default:ice" + } +}) + +minetest.register_craft({ + type = "shapeless", + output = "snow:snow_cobble", + recipe = { + "default:snow", + "default:ice" + } +}) + + + +-- Recycle basic, half-block, slabs back into full blocks + +-- A little "list" magic here. Instead of writing four crafts I only have to write two. ~ LazyJ +local recycle_default_slabs = { + "ice", + "snowblock", +} + +for _, name in pairs(recycle_default_slabs) do + local subname_default = name + + -- This craft is for default snowblocks and default ice. + -- 1 crafting recipe handles 2, default blocks. ~ LazyJ + minetest.register_craft({ + type = "shapeless", + output = "default:"..subname_default, + recipe = { + "snow:slab_"..subname_default, + "snow:slab_"..subname_default, + } + }) +end + + + +-- Similar list magic here too. I couldn't successfully combine these in the first list +-- because we are dealing with slabs/blocks from two different mods, the "Snow" mod and +-- minetest_game's "Default" mod. ~ LazyJ + +local recycle_snowmod_slabs = { + "snow_brick", + "snow_cobble", +} + +for _, name in pairs(recycle_snowmod_slabs) do + local subname_snowmod = name + + -- This craft is for the Snow mod's full-sized blocks. + -- 1 crafting recipe handles 2, or more, Snow mod blocks. ~ LazyJ + minetest.register_craft({ + type = "shapeless", + output = "snow:"..subname_snowmod, + recipe = { + "snow:slab_"..subname_snowmod, + "snow:slab_"..subname_snowmod, + } + }) +end diff --git a/mods/snow/src/falling_snow.lua b/mods/snow/src/falling_snow.lua new file mode 100755 index 00000000..1e40257e --- /dev/null +++ b/mods/snow/src/falling_snow.lua @@ -0,0 +1,234 @@ +--[[ +--================= +--====================================== +LazyJ's Fork of Splizard's "Snow" Mod +by LazyJ +version: Umpteen and 7/5ths something or another. +2014_04_12 +--====================================== +--================= + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +THE LIST OF CHANGES I'VE MADE +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +* Falling snow would destroy nodes it deposited snow on. I figured out that if +I switched the 'snow.place' with 'minetest.place_node' and increased the +y position by 2, then the nodes were nolonger destroyed and the snow +would start to pile up. + + + +~~~~~~ +TODO +~~~~~~ + +* Add code to prevent snowfall from depositing snow on or +near torches and lava. + +* Add code to prevent snowfall from depositing snow on +'walkable = false' defined nodes. + +--]] + + + +--============================================================= +-- CODE STUFF +--============================================================= + + +local weather_legacy + +local read_weather_legacy = function () + local file = io.open(minetest.get_worldpath().."/weather_v6", "r") + if not file then return end + local readweather = file:read() + file:close() + return readweather +end + +--Weather for legacy versions of minetest. +local save_weather_legacy = function () + local file = io.open(minetest.get_worldpath().."/weather_v6", "w+") + file:write(weather_legacy) + file:close() +end + + weather_legacy = read_weather_legacy() or "" + + minetest.register_globalstep(function(dtime) + if weather_legacy == "snow" then + if math.random(1, 10000) == 1 then + weather_legacy = "none" + save_weather_legacy() + end + else + if math.random(1, 50000) == 2 then + weather_legacy = "snow" + save_weather_legacy() + end + end + end) + +-- copied from meru mod +local SEEDDIFF3 = 9130 -- 9130 -- Values should match minetest mapgen desert perlin. +local OCTAVES3 = 3 -- 3 +local PERSISTENCE3 = 0.5 -- 0.5 +local SCALE3 = 250 -- 250 + +--Get snow at position. +local function get_snow(pos) + --Legacy support. + if weather_legacy == "snow" then + local perlin1 = minetest.get_perlin(112,3, 0.5, 150) + if perlin1:get2d({x=pos.x, y=pos.z}) <= 0.53 then + return false + end + + -- disable falling snow in desert + local desert_perlin = minetest.get_perlin(SEEDDIFF3, OCTAVES3, PERSISTENCE3, SCALE3) + local noise3 = desert_perlin:get2d({x=pos.x+150,y=pos.z+50}) -- Offsets must match minetest mapgen desert perlin. + if noise3 > 0.35 then -- Smooth transition 0.35 to 0.45. + return false + end + return true + end + return false +end + +local addvectors = vector and vector.add + +--Returns a random position between minp and maxp. +local function randpos(minp, maxp) + local x,z + if minp.x > maxp.x then + x = math.random(maxp.x,minp.x) + else + x = math.random(minp.x,maxp.x) + end + if minp.z > maxp.z then + z = math.random(maxp.z,minp.z) + else + z = math.random(minp.z,maxp.z) + end + return {x=x,y=minp.y,z=z} +end + +local default_snow_particle = { + amount = 3, + time = 0.5, + exptime = 5, + size = 50, + collisiondetection = false, + vertical = false, +} + +local function get_snow_particledef(data) + for n,i in pairs(default_snow_particle) do + data[n] = data[n] or i + end + for _,i in pairs({"vel", "acc", "exptime", "size"}) do + data["min"..i] = data[i] + data["max"..i] = data[i] + end + data.texture = "weather_snow.png^[transform"..math.random(0,7) + return data +end + +local function snow_fall(pos, player, animate) + local ground_y = nil + for y=pos.y+10,pos.y+20,1 do + local n = minetest.get_node({x=pos.x,y=y,z=pos.z}).name + if n ~= "air" and n ~= "ignore" then + return + end + end + for y=pos.y+10,pos.y-15,-1 do + local n = minetest.get_node({x=pos.x,y=y,z=pos.z}).name + if n ~= "air" and n ~= "ignore" then + ground_y = y + break + end + end + if not ground_y then + return + end + + pos = {x=pos.x, y=ground_y, z=pos.z} + + if get_snow(pos) then + if animate then + local spos = {x=pos.x, y=ground_y+10, z=pos.z} + minetest.add_particlespawner(get_snow_particledef({ + minpos = addvectors(spos, {x=-9, y=3, z=-9}), + maxpos = addvectors(spos, {x= 9, y=5, z= 9}), + vel = {x=0, y=-1, z=-1}, + acc = {x=0, y=0, z=0}, + playername = player:get_player_name() + })) + end + snow.place(pos, true) + --minetest.place_node({x=pos.x, y=pos.y+2, z=pos.z}, {name="default:snow"}) -- LazyJ + end +end + +-- Snow +local function calc_snowfall() + for _, player in pairs(minetest.get_connected_players()) do + local ppos = player:getpos() + + -- Make sure player is not in a cave/house... + if get_snow(ppos) + and minetest.get_node_light(ppos, 0.5) == 15 then + local animate + if not snow.lighter_snowfall then + local vel = {x=0, y=-1, z=-1} + local acc = {x=0, y=0, z=0} + minetest.add_particlespawner(get_snow_particledef({ + amount = 5, + minpos = addvectors(ppos, {x=-9, y=3, z=-9}), + maxpos = addvectors(ppos, {x= 9, y=5, z= 9}), + vel = vel, + acc = acc, + size = 25, + playername = player:get_player_name() + })) + + minetest.add_particlespawner(get_snow_particledef({ + amount = 4, + minpos = addvectors(ppos, {x=-5, y=3.2, z=-5}), + maxpos = addvectors(ppos, {x= 5, y=1.6, z= 5}), + vel = vel, + acc = acc, + exptime = 4, + size = 25, + playername = player:get_player_name() + })) + + animate = false + else + animate = true + end + + if math.random(1,5) == 4 then + snow_fall( + randpos( + addvectors(ppos, {x=-20, y=0, z=-20}), + addvectors(ppos, {x= 20, y=0, z= 20}) + ), + player, + animate + ) + end + end + end +end + +minetest.register_globalstep(function(dtime) + if snow.enable_snowfall then + calc_snowfall() + end +end) diff --git a/mods/snow/src/mapgen.lua b/mods/snow/src/mapgen.lua new file mode 100755 index 00000000..56d8f6ac --- /dev/null +++ b/mods/snow/src/mapgen.lua @@ -0,0 +1,160 @@ +--[[ +If you want to run PlantLife and mods that depend on it, i.e. MoreTrees, Disable the mapgen by +commenting-out the lines starting with "local mgname = " through "end" (I left a note were to start +and stop) Disabling "Snow's" mapgen allows MoreTrees and PlantLife to do their thing until the +issue is figured out. However, the pine and xmas tree code is still needed for when those +saplings grow into trees. --]] +--The *starting* comment looks like this: --[[ +--The *closing* comment looks like this: --]] + +-- ~ LazyJ, 2014_05_13 + + +--[[ Part 1: To disable the mapgen, add the *starting* comment under this line. + + +--Identify the mapgen. +minetest.register_on_mapgen_init(function(MapgenParams) + local mgname = MapgenParams.mgname + if not mgname then + io.write("[MOD] Snow Biomes: WARNING! mapgen could not be identifyed!\n") + end + if mgname == "v7" then + --Load mapgen_v7 compatibility. + dofile(minetest.get_modpath("snow").."/src/mapgen_v7.lua") + else + --Load mapgen_v6 compatibility. + dofile(minetest.get_modpath("snow").."/src/mapgen_v6.lua") + end +end) + +-- To complete the commenting-out add the *closing* comment under this line. + + + + +local pine_tree = { + axiom="TABff", + rules_a="[&T+f+ff+ff+ff+f]GA", + rules_b="[&T+f+Gf+Gf+Gf]GB", + trunk="default:pinetree", + leaves="snow:needles", + angle=90, + iterations=1, + random_level=0, + trunk_type="single", + thin_branches=true, +} + + + +local xmas_tree = { + axiom="TABff", + rules_a="[&T+f+ff+ff+ff+f]GA", + rules_b="[&T+f+Gf+Gf+Gf]GB", + trunk="default:pinetree", + leaves="snow:needles_decorated", + angle=90, + iterations=1, + random_level=0, + trunk_type="single", + thin_branches=true, +} + + + +--Makes pine tree +function snow.make_pine(pos,snow,xmas) + local minetest = minetest + local perlin1 = minetest.get_perlin(112,3, 0.5, 150) + local try_node = function(pos, node) + local n = minetest.get_node(pos).name + if n == "air" + or n == "ignore" then + minetest.add_node(pos, node) + end + end + if xmas then + minetest.remove_node(pos) + minetest.spawn_tree(pos, xmas_tree) + else + minetest.spawn_tree(pos, pine_tree) + end + if snow then + local x,z = pos.x,pos.z + try_node({x=x+1,y=pos.y+3,z=z+1},{name="default:snow"}) + try_node({x=x-1,y=pos.y+3,z=z-1},{name="default:snow"}) + try_node({x=x-1,y=pos.y+3,z=z+1},{name="default:snow"}) + try_node({x=x+1,y=pos.y+3,z=z-1},{name="default:snow"}) + + try_node({x=x+1,y=pos.y+5,z=z},{name="default:snow"}) + try_node({x=x-1,y=pos.y+5,z=z},{name="default:snow"}) + try_node({x=x,y=pos.y+5,z=z+1},{name="default:snow"}) + try_node({x=x,y=pos.y+5,z=z-1},{name="default:snow"}) + end + if xmas then + try_node({x=pos.x,y=pos.y+7,z=pos.z},{name="snow:star_lit"}) -- Added lit star. ~ LazyJ + elseif snow + and perlin1:get2d({x=pos.x,y=pos.z}) > 0.53 then + try_node({x=pos.x,y=pos.y+7,z=pos.z},{name="default:snow"}) + end +end + + + +--Makes pine tree +function snow.voxelmanip_pine(pos,a,data) + local c_snow = minetest.get_content_id("default:snow") + local c_pine_needles = minetest.get_content_id("snow:needles") + local c_pinetree = minetest.get_content_id("default:pinetree") + local c_air = minetest.get_content_id("air") + + local perlin1 = minetest.get_perlin(112,3, 0.5, 150) + for z = -1,1 do + local z = pos.z + z + for x = -1,1 do + local x = pos.x + x + + --Make tree. + for i = 1,2 do + data[a:index(x,pos.y+i,z)] = c_pine_needles + if x ~= 0 + and z ~= 0 + and perlin1:get2d({x=x,y=z}) > 0.53 then + local abovenode = a:index(x,pos.y+i+1,z) + data[abovenode] = c_snow + end + end + end + end + for i=3, 4 do + local x = pos.x + local y = pos.y+i + local z = pos.z + data[a:index(x+1,y,z)] = c_pine_needles + data[a:index(x-1,y,z)] = c_pine_needles + data[a:index(x,y,z+1)] = c_pine_needles + data[a:index(x,y,z-1)] = c_pine_needles + if perlin1:get2d({x=x+1,y=z}) > 0.53 then + data[a:index(x+1,y+1,z)] = c_snow + end + if perlin1:get2d({x=x+1,y=z}) > 0.53 then + data[a:index(x-1,y+1,z)] = c_snow + end + if perlin1:get2d({x=x,y=z+1}) > 0.53 then + data[a:index(x,y+1,z+1)] = c_snow + end + if perlin1:get2d({x=x,y=z-1}) > 0.53 then + data[a:index(x,y+1,z-1)] = c_snow + end + end + for i=0, 4 do + data[a:index(pos.x,pos.y+i,pos.z)] = c_pinetree + end + data[a:index(pos.x,pos.y+5,pos.z)] = c_pine_needles + data[a:index(pos.x,pos.y+6,pos.z)] = c_pine_needles + if perlin1:get2d({x=pos.x,y=pos.z}) > 0.53 then + data[a:index(pos.x,pos.y+7,pos.z)] = c_snow + end +end +]] diff --git a/mods/snow/src/mapgen_v6.lua b/mods/snow/src/mapgen_v6.lua new file mode 100755 index 00000000..d6f577f2 --- /dev/null +++ b/mods/snow/src/mapgen_v6.lua @@ -0,0 +1,486 @@ +-- https://github.com/paramat/meru/blob/master/init.lua#L52 +--[[ Parameters must match mgv6 biome noise +local np_default = { + offset = 0, + scale = 1, + spread = {x=250, y=250, z=250}, + seed = 9130, + octaves = 3, + persist = 0.5 +} + +-- 2D noise for coldness + +local np_cold = { + offset = 0, + scale = -1, + spread = {x=256, y=256, z=256}, + seed = 112, + octaves = 3, + persist = 0.5 +} + +-- 2D noise for icetype + +local np_ice = { + offset = 0, + scale = 1, + spread = {x=80, y=80, z=80}, + seed = 322345, + octaves = 3, + persist = 0.5 +} + +-- Debugging function + +local biome_strings = { + {"snowy", "plain", "alpine", "normal", "normal"}, + {"cool", "icebergs", "icesheet", "icecave", "icehole"} +} +local function biome_to_string(num,num2) + local biome = biome_strings[1][num] or "unknown "..num + return biome +end + + +local function do_ws_func(a, x) + local n = x/(16000) + local y = 0 + for k=1,1000 do + y = y + 1000*math.sin(math.pi * k^a * n)/(math.pi * k^a) + end + return y +end + + +local plantlike_ids = {} +local function is_plantlike(id) + if plantlike_ids[id] ~= nil then + return plantlike_ids[id] + end + local node = minetest.registered_nodes[minetest.get_name_from_content_id(id)] + if not node then + plantlike_ids[id] = false + return false + end + local drawtype = node.drawtype + if not drawtype + or drawtype ~= "plantlike" then + plantlike_ids[id] = false + return false + end + plantlike_ids[id] = true + return true +end + +local snowable_ids = {} +local function is_snowable(id) + if snowable_ids[id] ~= nil then + return snowable_ids[id] + end + local node = minetest.registered_nodes[minetest.get_name_from_content_id(id)] + if not node then + snowable_ids[id] = false + return false + end + local drawtype = node.drawtype + if drawtype + and drawtype ~= "normal" + and drawtype ~= "allfaces_optional" + and drawtype ~= "glasslike" then + snowable_ids[id] = false + return false + end + snowable_ids[id] = true + return true +end + +local c, replacements +local function define_contents() + c = { + dirt_with_grass = minetest.get_content_id("default:dirt_with_grass"), + dirt = minetest.get_content_id("default:dirt"), + tree = minetest.get_content_id("default:tree"), + apple = minetest.get_content_id("default:apple"), + snow = minetest.get_content_id("default:snow"), + snow_block = minetest.get_content_id("default:snowblock"), + dirt_with_snow = minetest.get_content_id("default:dirt_with_snow"), + air = minetest.get_content_id("air"), + ignore = minetest.get_content_id("ignore"), + stone = minetest.get_content_id("default:stone"), + dry_shrub = minetest.get_content_id("default:dry_shrub"), + snow_shrub = minetest.get_content_id("snow:shrub_covered"), + leaves = minetest.get_content_id("default:leaves"), + jungleleaves = minetest.get_content_id("default:jungleleaves"), + junglegrass = minetest.get_content_id("default:junglegrass"), + ice = minetest.get_content_id("default:ice"), + water = minetest.get_content_id("default:water_source"), + papyrus = minetest.get_content_id("default:papyrus"), + sand = minetest.get_content_id("default:sand"), + desert_sand = minetest.get_content_id("default:desert_sand"), + } + replacements = snow.known_plants or {} +end + +minetest.register_on_generated(function(minp, maxp, seed) + local t1 = os.clock() + + local x0 = minp.x + local z0 = minp.z + local x1 = maxp.x + local z1 = maxp.z + + local smooth = snow.smooth_biomes + + if not c then + define_contents() + end + + local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") + local area = VoxelArea:new({MinEdge=emin, MaxEdge=emax}) + local data = vm:get_data() + local param2s = vm:get_param2_data() + + local snow_tab,num = {},1 + local pines_tab,pnum = {},1 + + local sidelen = x1 - x0 + 1 + local chulens = {x=sidelen, y=sidelen, z=sidelen} + local nvals_default = minetest.get_perlin_map(np_default, chulens):get2dMap_flat({x=x0+150, y=z0+50}) + local nvals_cold, nvals_ice + + -- Choose biomes + local pr = PseudoRandom(seed+57) + -- Land biomes + local biome = pr:next(1, 5) + local snowy = biome == 1 -- spawns snow + local alpine = biome == 3 -- rocky terrain + -- Misc biome settings + local icy = pr:next(1, 2) == 2 -- if enabled spawns ice in sand instead of snow blocks + local shrubs = pr:next(1,2) == 1 -- spawns dry shrubs in snow + local pines = pr:next(1,2) == 1 -- spawns pines + -- Reseed random + pr = PseudoRandom(seed+68) + + -- Loop through columns in chunk + local write_to_map = false + local ni = 1 + for z = z0, z1 do + for x = x0, x1 do + local in_biome = false + local test + if nvals_default[ni] < 0.35 then + if not nvals_cold then + nvals_cold = minetest.get_perlin_map(np_cold, chulens):get2dMap_flat({x=x0, y=z0}) + end + test = math.min(nvals_cold[ni], 1) + if smooth + and not snowy then + if (test > 0.73 or (test > 0.43 and pr:next(0,29) > (0.73 - test) * 100 )) then + in_biome = true + end + elseif test > 0.53 then + in_biome = true + end + end + + if not in_biome then + if alpine + and test + and test > 0.43 then + -- remove trees near alpine + local ground_y = nil + for y = maxp.y, minp.y, -1 do + local nodid = data[area:index(x, y, z)] + if nodid ~= c.air + and nodid ~= c.ignore then + ground_y = y + break + end + end + if ground_y == maxp.y then -- avoid awful snow layers at chunk boundaries underground + ground_y = nil + end + + if ground_y then + local vi = area:index(x, ground_y, z) + if data[vi] == c.leaves + or data[vi] == c.jungleleaves then + for y = ground_y, -16, -1 do + local vi = area:index(x, y, z) + local id = data[vi] + if id ~= c.air then + if id == c.leaves + or id == c.jungleleaves + or id == c.tree + or id == c.apple then + data[vi] = c.air + else + break + end + end + end + end + end + end + else + write_to_map = true + if not nvals_ice then + nvals_ice = minetest.get_perlin_map(np_ice, chulens):get2dMap_flat({x=x0, y=z0}) + end + local icetype = nvals_ice[ni] + local cool = icetype > 0 -- only spawns ice on edge of water + local icebergs = icetype > -0.2 and icetype <= 0 + local icehole = icetype > -0.4 and icetype <= -0.2 -- icesheet with holes + local icesheet = icetype > -0.6 and icetype <= -0.4 + local icecave = icetype <= -0.6 + + local ground_y + for y = maxp.y, minp.y, -1 do + local nodid = data[area:index(x, y, z)] + if nodid ~= c.air and nodid ~= c.ignore then + ground_y = y + break + end + end + if ground_y == maxp.y then -- avoid awful snow layers at chunk boundaries underground + ground_y = nil + end + + if ground_y then + local node = area:index(x, ground_y, z) + local c_ground = data[node] + + if c_ground == c.dirt_with_grass then + if alpine + and test > 0.53 then + snow_tab[num] = {ground_y, z, x, test} + num = num+1 + -- generate stone ground + for y = ground_y, math.max(-6, minp.y-6), -1 do + local vi = area:index(x, y, z) + if data[vi] == c.stone then + break + end + data[vi] = c.stone + end + elseif pines + and pr:next(1,36) == 1 then + pines_tab[pnum] = {x=x, y=ground_y+1, z=z} + pnum = pnum+1 + elseif shrubs + and pr:next(1,928) == 1 then + data[node] = c.dirt_with_snow + data[area:index(x, ground_y+1, z)] = c.dry_shrub + else + if snowy + or test > 0.8 then + -- more, deeper snow + data[node] = c.snow_block + else + data[node] = c.dirt_with_snow + end + snow_tab[num] = {ground_y, z, x, test} + num = num+1 + end + elseif c_ground == c.water then + if not icesheet + and not icecave + and not icehole then + local nds = { + data[area:index(x+1, ground_y, z)], + data[area:index(x, ground_y, z+1)], + data[area:index(x+1, ground_y, z+1)], + data[area:index(x-1, ground_y, z-1)], + data[area:index(x-1, ground_y, z)], + data[area:index(x, ground_y, z-1)], + } + local ice + if pr:next(1,4) == 1 + and (cool or icebergs) then + for _,i in ipairs(nds) do + if i == c.ice then + ice = true + break + end + end + end + if not ice then + for _,i in ipairs(nds) do + if i ~= c.water + and i ~= c.ice + and i ~= c.air + and i ~= c.ignore then + ice = true + break + end + end + end + local y = data[area:index(x, ground_y-1, z)] + if ice + or (y ~= c.water and y ~= c.ice) -- and y ~= "air") …I don't think y can be a string here ~HybridDog + or (icebergs and pr:next(1,6) == 1) then + data[node] = c.ice + end + else + if icesheet + or icecave + or (icehole and pr:next(1,10) > 1) then + data[node] = c.ice + end + if icecave then + for y = ground_y-1, -33, -1 do + local vi = area:index(x, y, z) + if data[vi] ~= c.water then + break + end + data[vi] = c.air + end + end + if icesheet then + -- put snow onto icesheets + snow_tab[num] = {ground_y, z, x, test} + num = num+1 + end + end + elseif c_ground == c.sand then + if icy then + data[node] = c.ice + end + snow_tab[num] = {ground_y, z, x, test} + num = num+1 + elseif c_ground == c.papyrus then + snow_tab[num] = {ground_y, z, x, test} + num = num+1 + -- replace papyrus plants with snowblocks + local y = ground_y + for _ = 1,7 do + local vi = area:index(x, y, z) + if data[vi] == c.papyrus then + data[vi] = c.snow_block + y = y-1 + else + break + end + end + elseif alpine then + -- make stone pillars out of trees and other stuff + for y = ground_y, math.max(-6, minp.y-6), -1 do + local stone = area:index(x, y, z) + if data[stone] == c.stone then + break + end + data[stone] = c.stone + end + -- put snow onto it + snow_tab[num] = {ground_y, z, x, test} + num = num+1 + elseif c_ground ~= c.desert_sand then + if is_snowable(c_ground) then + -- put snow onto it + snow_tab[num] = {ground_y, z, x, test} + num = num+1 + end + for y = 0, 12 do + y = ground_y-y + local vi = area:index(x, y, z) + local nd = data[vi] + local plantlike = is_plantlike(nd) + if replacements[nd] then + data[vi] = replacements[nd] + if plantlike then + param2s[vi] = pr:next(0,179) + end + elseif nd == c.dirt_with_grass then + data[vi] = c.dirt_with_snow + break + elseif plantlike then + local under = area:index(x, y-1, z) + if data[under] == c.dirt_with_grass then + -- replace other plants with shrubs + data[vi] = c.snow_shrub + param2s[vi] = pr:next(0,179) + data[under] = c.dirt_with_snow + break + end + elseif nd == c.stone then + break + end + end + end + end + end + ni = ni + 1 + end + end + + if num ~= 1 then + for _,i in pairs(snow_tab) do + -- set snow + data[area:index(i[3], i[1]+1, i[2])] = c.snow + end + local wsz, wsx + for _,i in pairs(snow_tab) do + local y,z,x,test = unpack(i) + test = (test-0.53)/0.47 -- /(1-0.53) + if test > 0 then + local maxh = math.floor(test*10)%10+1 + if maxh ~= 1 then + local h = math.floor( do_ws_func(2, x) + do_ws_func(5, z)*5)%10+1 + if h ~= 1 then + -- search for nearby snow + y = y+1 + for i = -1,1,2 do + for _,cord in pairs({{x+i,z}, {x,z+i}}) do + local nd = data[area:index(cord[1], y, cord[2])] + if nd == c.air + or is_plantlike(nd) then + h = h/2 + end + end + end + h = math.floor(h+0.5) + if h > 1 then + -- make snowdrifts walkable + if h == 10 then + h = 5 + end + h = math.min(maxh, h) + local vi = area:index(x, y, z) + if h == 9 then + -- replace the snow with a snowblock because its a full node + data[vi] = c.snow_block + else + -- set a specific snow height + param2s[vi] = h*7 + end + end + end + end + end + end + end + + -- spawn pines + if pines + and pnum ~= 1 then + local spawn_pine = snow.voxelmanip_pine + for _,pos in pairs(pines_tab) do + spawn_pine(pos, area, data) + end + end + + vm:set_data(data) + vm:set_param2_data(param2s) + vm:set_lighting({day=0, night=0}) + vm:calc_lighting() + vm:write_to_map() + + if write_to_map + and snow.debug then -- print if any column of mapchunk was snow biome + local biome_string = biome_to_string(biome) + local chugent = math.ceil((os.clock() - t1) * 1000) + print("[snow] "..biome_string.." x "..minp.x.." z "..minp.z.." time "..chugent.." ms") + end +end) + diff --git a/mods/snow/src/mapgen_v7.lua b/mods/snow/src/mapgen_v7.lua new file mode 100755 index 00000000..ebb3eedb --- /dev/null +++ b/mods/snow/src/mapgen_v7.lua @@ -0,0 +1,138 @@ +minetest.register_biome({ + name = "snow_biome_default", + + node_top = "default:dirt_with_snow", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 2, + + height_min = snow.min_height, + height_max = snow.min_height+60, + heat_point = 10.0, + humidity_point = 40.0, +}) + +minetest.register_biome({ + name = "snow_biome_forest", + + node_top = "default:dirt_with_snow", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 2, + + height_min = snow.min_height, + height_max = snow.min_height+60, + heat_point = 10.0, + humidity_point = 55.0, +}) + +minetest.register_biome({ + name = "snow_biome_lush", + + node_top = "default:dirt_with_snow", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 2, + + height_min = snow.min_height, + height_max = snow.min_height+60, + heat_point = 10.0, + humidity_point = 70.0, +}) + +minetest.register_biome({ + name = "snow_biome_alpine", + + node_top = "default:stone", + depth_top = 1, + node_filler = "default:stone", + + height_min = snow.min_height+60, + height_max = 31000, + heat_point = 10.0, + humidity_point = 40.0, +}) + +minetest.register_biome({ + name = "snow_biome_sand", + + node_top = "default:sand", + depth_top = 3, + node_filler = "default:stone", + depth_filler = 0, + + height_min = -31000, + height_max = 2, + heat_point = 10.0, + humidity_point = 40.0, +}) + + +--Pine tree. +minetest.register_decoration({ + deco_type = "schematic", + place_on = "default:dirt_with_snow", + sidelen = 16, + fill_ratio = 0.005, + biomes = {"snow_biome_default"}, + schematic = minetest.get_modpath("snow").."/schematics/pine.mts", + flags = "place_center_x, place_center_z", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = "default:dirt_with_snow", + sidelen = 16, + fill_ratio = 0.05, + biomes = {"snow_biome_forest"}, + schematic = minetest.get_modpath("snow").."/schematics/pine.mts", + flags = "place_center_x, place_center_z", +}) + +minetest.register_decoration({ + deco_type = "schematic", + place_on = "default:dirt_with_snow", + sidelen = 16, + fill_ratio = 0.1, + biomes = {"snow_biome_lush"}, + schematic = minetest.get_modpath("snow").."/schematics/pine.mts", + flags = "place_center_x, place_center_z", +}) + +--Dry shrubs. +minetest.register_decoration({ + deco_type = "simple", + place_on = "default:dirt_with_snow", + sidelen = 16, + fill_ratio = 0.005, + biomes = {"snow_biome_default"}, + decoration = "default:dry_shrub", +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = "default:dirt_with_snow", + sidelen = 16, + fill_ratio = 0.05, + biomes = {"snow_biome_forest", "snow_biome_lush"}, + decoration = "default:dry_shrub", +}) + +--Snow. +minetest.register_decoration({ + deco_type = "simple", + place_on = "default:dirt_with_snow", + sidelen = 16, + fill_ratio = 10, + biomes = {"snow_biome_default", "snow_biome_forest", "snow_biome_lush"}, + decoration = "default:snow", +}) + +minetest.register_decoration({ + deco_type = "simple", + place_on = "default:stone", + sidelen = 16, + fill_ratio = 10, + biomes = {"snow_biome_alpine"}, + decoration = "default:snow", +}) diff --git a/mods/snow/src/nodes.lua b/mods/snow/src/nodes.lua new file mode 100755 index 00000000..94bf1fbd --- /dev/null +++ b/mods/snow/src/nodes.lua @@ -0,0 +1,360 @@ +-- NODES + +-- Pine Needles +local nodedef = { + description = "Pine Needles", + drawtype = "allfaces_optional", + visual_scale = 1.3, + tiles = {"snow_needles.png"}, + waving = 1, + paramtype = "light", + groups = {snappy=3, leafdecay=5}, + furnace_burntime = 1, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = {'snow:sapling_pine'}, + rarity = 20, + }, + { + items = {'snow:needles'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), +} + +--[[ +If christmas_content is enabled, then this next part will override the pine needles' drop code +(in the code section above) and adds Xmas tree saplings to the items that are dropped. +The Xmas tree needles are registred and defined a farther down in this nodes.lua file. + +~ LazyJ +]] +if snow.christmas_content then + table.insert(nodedef.drop.items, 1, { + -- player will get xmas tree with 1/120 chance + items = {'snow:xmas_tree'}, + rarity = 120, + }) +end + +minetest.register_node("snow:needles", table.copy(nodedef)) + + + + + + --Christmas easter egg + minetest.register_on_mapgen_init( function() + if rawget(_G, "skins") then + skins.add("character_snow_man") + end + end + ) + + +-- Decorated Pine Leaves + +nodedef.description ="Decorated "..nodedef.description +nodedef.light_source = 5 +nodedef.waving = nil +if snow.disable_deco_needle_ani then + nodedef.tiles = {"snow_needles_decorated.png"} +else + -- Animated, "blinking lights" version. ~ LazyJ + nodedef.inventory_image = minetest.inventorycube("snow_needles_decorated.png") + nodedef.tiles = { + {name="snow_needles_decorated_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=20.0}} + } +end +nodedef.drop.items[#nodedef.drop.items] = {items = {'snow:needles_decorated'}} + +minetest.register_node("snow:needles_decorated", nodedef) + + +-- Saplings + +nodedef = { + description = "Pine Sapling", + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"snow_sapling_pine.png"}, + inventory_image = "snow_sapling_pine.png", + wield_image = "snow_sapling_pine.png", + paramtype = "light", + walkable = false, + groups = {snappy=2,dig_immediate=3}, + furnace_burntime = 10, + sounds = default.node_sound_defaults(), +} + +-- Pine Sapling +minetest.register_node("snow:sapling_pine", table.copy(nodedef)) + +-- Xmas Tree Sapling +nodedef.description = "Christmas Tree" +nodedef.tiles = {"snow_xmas_tree.png"} +nodedef.inventory_image = "snow_xmas_tree.png" +nodedef.wield_image = "snow_xmas_tree.png" + +minetest.register_node("snow:xmas_tree", nodedef) + + +nodedef = { + description = "Star", + drawtype = "plantlike", + tiles = {"snow_star.png"}, + inventory_image = "snow_star.png", + wield_image = "snow_star.png", + paramtype = "light", + walkable = false, + -- Don't want the ornament breaking too easily because you have to punch it to turn it on and off. ~ LazyJ + groups = {cracky=1, crumbly=1, choppy=1, oddly_breakable_by_hand=1}, + -- Breaking "glass" sound makes it sound like a real, broken, Xmas tree ornament (Sorry, Mom!). ;)- ~ LazyJ + sounds = default.node_sound_glass_defaults({dig = {name="default_glass_footstep", gain=0.2}}), + on_punch = function(pos, node) -- Added a "lit" star that can be punched on or off depending on your preference. ~ LazyJ + node.name = "snow:star_lit" + minetest.set_node(pos, node) + nodeupdate(pos) + end, +} + +-- Star on Xmas Trees +minetest.register_node("snow:star", table.copy(nodedef)) + +-- Star (Lit Version) on Xmas Trees +nodedef.description = nodedef.description.." Lighted" +nodedef.light_source = LIGHT_MAX +nodedef.tiles = {"snow_star_lit.png"} +nodedef.drop = "snow:star" +nodedef.groups.not_in_creative_inventory = 1 +nodedef.on_punch = function(pos, node) + node.name = "snow:star" + minetest.set_node(pos, node) + nodeupdate(pos) +end + +minetest.register_node("snow:star_lit", nodedef) + + + +-- Plants + +-- Moss +minetest.register_node("snow:moss", { + description = "Moss", + inventory_image = "snow_moss.png", + tiles = {"snow_moss.png"}, + drawtype = "signlike", + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + selection_box = { + type = "wallmounted", + }, + is_ground_content = true, + groups = {crumbly=3, attached_node=1}, + furnace_burntime = 3, +}) + +-- Shrub(s) +nodedef = { + description = "Snow Shrub", + tiles = {"snow_shrub.png"}, + inventory_image = "snow_shrub.png", + wield_image = "snow_shrub.png", + drawtype = "plantlike", + paramtype = "light", + waving = 1, + sunlight_propagates = true, + walkable = false, + is_ground_content = true, + buildable_to = true, + groups = {snappy=3,flammable=3,attached_node=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, -5/16, 0.3}, + }, + furnace_burntime = 5, +} +minetest.register_node("snow:shrub", table.copy(nodedef)) + +nodedef.tiles = {"snow_shrub.png^snow_shrub_covering.png"} +nodedef.inventory_image = "snow_shrub.png^snow_shrub_covering.png" +nodedef.wield_image = "snow_shrub.png^snow_shrub_covering.png" +nodedef.drop = "snow:shrub" +nodedef.furnace_burntime = 3 +minetest.register_node("snow:shrub_covered", nodedef) + +-- Flowers +if rawget(_G, "flowers") then + -- broken flowers + snow.known_plants = {} + for _,name in pairs({"dandelion_yellow", "geranium", "rose", "tulip", "dandelion_white", "viola"}) do + local flowername = "flowers:"..name + local newname = "snow:flower_"..name + local flower = minetest.registered_nodes[flowername] + minetest.register_node(newname, { + drawtype = "plantlike", + tiles = { "snow_" .. name .. ".png" }, + sunlight_propagates = true, + paramtype = "light", + walkable = false, + drop = "", + groups = {snappy=3, attached_node = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = flower.selection_box + }) + snow.known_plants[minetest.get_content_id(flowername)] = minetest.get_content_id(newname) + end +end + +-- Leaves +local leaves = minetest.registered_nodes["default:leaves"] +nodedef = { + description = "Snow Leaves", + tiles = {"snow_leaves.png"}, + waving = 1, + visual_scale = leaves.visual_scale, + drawtype = leaves.drawtype, + paramtype = leaves.paramtype, + groups = leaves.groups, + drop = leaves.drop, + sounds = leaves.sounds, +} +nodedef.groups.flammable = 1 + +minetest.register_node("snow:leaves", nodedef) +snow.known_plants[minetest.get_content_id("default:leaves")] = minetest.get_content_id("snow:leaves") + +local apple = minetest.registered_nodes["default:apple"] +nodedef = { + description = "Snow Apple", + drawtype = "plantlike", + tiles = {"snow_apple.png"}, + paramtype = "light", + walkable = false, + sunlight_propagates = apple.sunlight_propagates, + selection_box = apple.selection_box, + groups = apple.groups, + sounds = apple.sounds, + drop = apple.drop, +} +nodedef.groups.flammable = 1 + +minetest.register_node("snow:apple", nodedef) +snow.known_plants[minetest.get_content_id("default:apple")] = minetest.get_content_id("snow:apple") + +-- TODO +snow.known_plants[minetest.get_content_id("default:jungleleaves")] = minetest.get_content_id("default:jungleleaves") + + + +local function snow_onto_dirt(pos) + pos.y = pos.y - 1 + local node = minetest.get_node(pos) + if node.name == "default:dirt_with_grass" + or node.name == "default:dirt" then + node.name = "default:dirt_with_snow" + minetest.set_node(pos, node) + end +end + + + +-- Bricks + +nodedef = { + description = "Snow Brick", + tiles = {"snow_snow_brick.png"}, + is_ground_content = true, + --freezemelt = "default:water_source", -- deprecated + liquidtype = "none", + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", -- Allow blocks to be rotated with the screwdriver or + -- by player position. ~ LazyJ + -- I made this a little harder to dig than snow blocks because + -- I imagine snow brick as being much more dense and solid than fluffy snow. ~ LazyJ + groups = {cracky=2, crumbly=2, choppy=2, oddly_breakable_by_hand=2, melts=1, icemaker=1, cooks_into_ice=1}, + --Let's use the new snow sounds instead of the old grass sounds. ~ LazyJ + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_snow_footstep", gain=0.25}, + dig = {name="default_dig_crumbly", gain=0.4}, + dug = {name="default_snow_footstep", gain=0.75}, + place = {name="default_place_node", gain=1.0} + }), + -- The "on_construct" part below, thinking in terms of layers, dirt_with_snow could also + -- double as dirt_with_frost which adds subtlety to the winterscape. ~ LazyJ + on_construct = snow_onto_dirt +} + +-- Snow Brick +minetest.register_node("snow:snow_brick", table.copy(nodedef)) + + +-- hard Ice Brick, original texture from LazyJ +local ibdef = table.copy(nodedef) +ibdef.description = "Ice Brick" +ibdef.tiles = {"snow_ice_brick.png"} +ibdef.use_texture_alpha = true +ibdef.drawtype = "glasslike" +ibdef.groups = {cracky=1, crumbly=1, choppy=1, melts=1} +ibdef.sounds = default.node_sound_glass_defaults({ + dug = {name="default_hard_footstep", gain=1} +}) + +minetest.register_node("snow:ice_brick", ibdef) + + +-- Snow Cobble ~ LazyJ +-- Described as Icy Snow +nodedef.description = "Icy Snow" +nodedef.tiles = {"snow_snow_cobble.png"} + +minetest.register_node("snow:snow_cobble", nodedef) + + + +-- Override Default Nodes to Add Extra Functions + +-- This adds code to the existing default ice. ~ LazyJ +minetest.override_item("default:ice", { + -- The Lines: 1. Alpah to make semi-transparent ice, 2 to work with + -- the dirt_with_grass/snow/just dirt ABMs. ~ LazyJ, 2014_03_09 + use_texture_alpha = true, -- 1 + param2 = 0, + --param2 is reserved for how much ice will freezeover. + sunlight_propagates = true, -- 2 + drawtype = "glasslike", + inventory_image = minetest.inventorycube("default_ice.png").."^[brighten", + liquidtype = "none", + -- I made this a lot harder to dig than snow blocks because ice is much more dense + -- and solid than fluffy snow. ~ LazyJ + groups = {cracky=2, crumbly=1, choppy=1, --[[oddly_breakable_by_hand=1,]] melts=1}, + on_construct = snow_onto_dirt, + liquids_pointable = true, + --Make ice freeze over when placed by a maximum of 10 blocks. + after_place_node = function(pos) + minetest.set_node(pos, {name="default:ice", param2=math.random(0,10)}) + end +}) + + + +-- This adds code to the existing, default snowblock. ~ LazyJ +minetest.override_item("default:snowblock", { + liquidtype = "none", -- LazyJ to make dirt below change to dirt_with_snow (see default, nodes.lua, dirt ABM) + paramtype = "light", -- LazyJ to make dirt below change to dirt_with_snow (see default, nodes.lua, dirt ABM) + sunlight_propagates = true, -- LazyJ to make dirt below change to dirt_with_snow (see default, nodes.lua, dirt ABM) + -- Snow blocks should be easy to dig because they are just fluffy snow. ~ LazyJ + groups = {cracky=3, crumbly=3, choppy=3, oddly_breakable_by_hand=3, melts=1, icemaker=1, cooks_into_ice=1, falling_node=1}, + --drop = "snow:snow_cobble", + on_construct = snow_onto_dirt + -- Thinking in terms of layers, dirt_with_snow could also double as + -- dirt_with_frost which adds subtlety to the winterscape. ~ LazyJ, 2014_04_04 +}) diff --git a/mods/snow/src/sled.lua b/mods/snow/src/sled.lua new file mode 100755 index 00000000..58f0cdfb --- /dev/null +++ b/mods/snow/src/sled.lua @@ -0,0 +1,231 @@ +--[[ +--================= +--====================================== +LazyJ's Fork of Splizard's "Snow" Mod +by LazyJ +version: Umpteen and 7/5ths something or another. +2014_04_12 +--====================================== +--================= + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +THE LIST OF CHANGES I'VE MADE +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + +* The HUD message that displayed when a player sat on the sled would not go away after the player +got off the sled. I spent hours on trial-and-error while reading the lua_api.txt and scrounging +the Internet for a needle-in-the-haystack solution as to why the hud_remove wasn't working. +Turns out Splizard's code was mostly correct, just not assembled in the right order. + +The key to the solution was found in the code of leetelate's scuba mod: +http://forum.minetest.net/viewtopic.php?id=7175 + +* Changed the wording of the HUD message for clarity. + + +~~~~~~ +TODO +~~~~~~ + +* Figure out why the player avatars remain in a seated position, even after getting off the sled, +if they flew while on the sled. 'default.player_set_animation', where is a better explanation +for this and what are it's available options? + +* Go through, clean-up my notes and get them better sorted. Some are in the code, some are +scattered in my note-taking program. This "Oh, I'll just make a little tweak here and a +little tweak there" project has evolved into something much bigger and more complex +than I originally planned. :p ~ LazyJ + +* find out why the sled disappears after rightclicking it ~ HybridDog + +--]] + + + +--============================================================= +-- CODE STUFF +--============================================================= + +-- +-- Helper functions +-- + +vector.zero = vector.zero or {x=0, y=0, z=0} + +local function table_find(t, v) + for i = 1,#t do + if t[i] == v then + return true + end + end + return false +end + +local function is_water(pos) + return minetest.get_item_group(minetest.get_node(pos).name, "water") ~= 0 +end + + +-- +-- Sled entity +-- + +local sled = { + physical = true, + collisionbox = {-0.6,-0.25,-0.6, 0.6,0.3,0.6}, + visual = "mesh", + mesh = "sled.x", + textures = {"sled.png"}, +} + +local players_sled = {} +local function join_sled(self, player) + local pos = self.object:getpos() + player:setpos(pos) + local name = player:get_player_name() + players_sled[name] = true + default.player_attached[name] = true + default.player_set_animation(player, "sit" , 30) + self.driver = name + self.object:set_attach(player, "", {x=0,y=-9,z=0}, {x=0,y=90,z=0}) + self.object:setyaw(player:get_look_yaw())-- - math.pi/2) +end + +local function leave_sled(self, player) + local name = player:get_player_name() + players_sled[name] = false + self.driver = nil + self.object:set_detach() + default.player_attached[name] = false + default.player_set_animation(player, "stand" , 30) + + player:set_physics_override({ + speed = 1, + jump = 1, + }) + player:hud_remove(self.HUD) -- And here is part 2. ~ LazyJ + self.object:remove() + + --Give the sled back again + player:get_inventory():add_item("main", "snow:sled") +end + +function sled:on_rightclick(player) + if self.driver + or not snow.sleds then + return + end + join_sled(self, player) + player:set_physics_override({ + speed = 2, -- multiplier to default value + jump = 0, -- multiplier to default value + }) + +-- Here is part 1 of the fix. ~ LazyJ + self.HUD = player:hud_add({ + hud_elem_type = "text", + position = {x=0.5, y=0.89}, + name = "sled", + scale = {x=2, y=2}, + text = "You are on the sled! Press the sneak key to get off the sled.", -- LazyJ + direction = 0, + }) +-- End part 1 +end + +function sled:on_activate(staticdata, dtime_s) + self.object:set_armor_groups({immortal=1}) + self.object:setacceleration({x=0, y=-10, z=0}) + if staticdata then + self.v = tonumber(staticdata) + end +end + +function sled:get_staticdata() + return tostring(self.v) +end + +function sled:on_punch(puncher) + self.object:remove() + if puncher + and puncher:is_player() then + puncher:get_inventory():add_item("main", "snow:sled") + end +end + +local driveable_nodes = {"default:snow","default:snowblock","default:ice","default:dirt_with_snow", "group:icemaker"} +local function accelerating_possible(pos) + if is_water(pos) then + return false + end + if table_find(driveable_nodes, minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name) then + return true + end + return false +end + +local timer = 0 +function sled:on_step(dtime) + if not self.driver then + return + end + timer = timer+dtime + if timer < 1 then + return + end + timer = 0 + local player = minetest.get_player_by_name(self.driver) + if not player then + return + end + if player:get_player_control().sneak + or not accelerating_possible(vector.round(self.object:getpos())) then + leave_sled(self, player) + end +end + +minetest.register_entity("snow:sled", sled) + + +minetest.register_craftitem("snow:sled", { + description = "Sled", + inventory_image = "snow_sled.png", + wield_image = "snow_sled.png", + wield_scale = {x=2, y=2, z=1}, + liquids_pointable = true, + stack_max = 1, + + on_use = function(itemstack, placer) + if players_sled[placer:get_player_name()] then + return + end + local pos = placer:getpos() + if accelerating_possible(vector.round(pos)) then + pos.y = pos.y+0.5 + + --Get on the sled and remove it from inventory. + minetest.add_entity(pos, "snow:sled"):right_click(placer) + itemstack:take_item(); return itemstack + end + end, +}) + +minetest.register_craft({ + output = "snow:sled", + recipe = { + {"", "", ""}, + {"group:stick", "", ""}, + {"group:wood", "group:wood", "group:wood"}, + }, +}) +minetest.register_craft({ + output = "snow:sled", + recipe = { + {"", "", ""}, + {"", "", "group:stick"}, + {"group:wood", "group:wood", "group:wood"}, + }, +}) diff --git a/mods/snow/src/snowball.lua b/mods/snow/src/snowball.lua new file mode 100755 index 00000000..d0be241d --- /dev/null +++ b/mods/snow/src/snowball.lua @@ -0,0 +1,345 @@ +--============ +--Snowballs +--============ + +-- Snowballs were destroying nodes if the snowballs landed just right. +-- Quite a bit of trial-and-error learning here and it boiled down to a +-- small handful of code lines making the difference. ~ LazyJ + +local creative_mode = minetest.setting_getbool("creative_mode") + +local function get_gravity() + local grav = tonumber(minetest.setting_get("movement_gravity")) or 9.81 + return grav*snow.snowball_gravity +end + +local someone_throwing +local timer = 0 + +--Shoot snowball +local function snow_shoot_snowball(item, player) + local addp = {y = 1.625} -- + (math.random()-0.5)/5} + local dir = player:get_look_dir() + local dif = 2*math.sqrt(dir.z*dir.z+dir.x*dir.x) + addp.x = dir.z/dif -- + (math.random()-0.5)/5 + addp.z = -dir.x/dif -- + (math.random()-0.5)/5 + local pos = vector.add(player:getpos(), addp) + local obj = minetest.add_entity(pos, "snow:snowball_entity") + obj:setvelocity(vector.multiply(dir, snow.snowball_velocity)) + obj:setacceleration({x=dir.x*-3, y=-get_gravity(), z=dir.z*-3}) + if creative_mode then + if not someone_throwing then + someone_throwing = true + timer = -0.5 + end + return + end + item:take_item() + return item +end + +if creative_mode then + local function update_step(dtime) + timer = timer+dtime + if timer < 0.006 then + return + end + timer = 0 + + local active + for _,player in pairs(minetest.get_connected_players()) do + if player:get_player_control().LMB then + local item = player:get_wielded_item() + local itemname = item:get_name() + if itemname == "default:snow" then + snow_shoot_snowball(nil, player) + active = true + break + end + end + end + + -- disable the function if noone currently throws them + if not active then + someone_throwing = false + end + end + + -- do automatic throwing using a globalstep + minetest.register_globalstep(function(dtime) + -- only if one holds left click + if someone_throwing then + update_step(dtime) + end + end) +end + +--The snowball Entity +local snow_snowball_ENTITY = { + physical = false, + timer = 0, + collisionbox = {-5/16,-5/16,-5/16, 5/16,5/16,5/16}, +} + +function snow_snowball_ENTITY.on_activate(self) + self.object:set_properties({textures = {"default_snowball.png^[transform"..math.random(0,7)}}) + self.object:setacceleration({x=0, y=-get_gravity(), z=0}) + self.lastpos = self.object:getpos() + minetest.after(0.1, function(obj) + if not obj then + return + end + local vel = obj:getvelocity() + if vel + and vel.y ~= 0 then + return + end + minetest.after(0, function(obj) + if not obj then + return + end + local vel = obj:getvelocity() + if not vel + or vel.y == 0 then + obj:remove() + end + end, obj) + end, self.object) +end + +--Snowball_entity.on_step()--> called when snowball is moving. +function snow_snowball_ENTITY.on_step(self, dtime) + self.timer = self.timer+dtime + if self.timer > 600 then + -- 10 minutes are too long for a snowball to fly somewhere + self.object:remove() + end + + if self.physical then + local fell = self.object:getvelocity().y == 0 + if not fell then + return + end + local pos = vector.round(self.object:getpos()) + if minetest.get_node(pos).name == "air" then + pos.y = pos.y-1 + if minetest.get_node(pos).name == "air" then + return + end + end + snow.place(pos) + self.object:remove() + return + end + + local pos = vector.round(self.object:getpos()) + if vector.equals(pos, self.lastpos) then + return + end + if minetest.get_node(pos).name ~= "air" then + self.object:setacceleration({x=0, y=-get_gravity(), z=0}) + --self.object:setvelocity({x=0, y=0, z=0}) + pos = self.lastpos + self.object:setpos(pos) + local gain = vector.length(self.object:getvelocity())/30 + minetest.sound_play("default_snow_footstep", {pos=pos, gain=gain}) + self.object:set_properties({physical = true}) + self.physical = true + return + end + self.lastpos = vector.new(pos) +end + + + +minetest.register_entity("snow:snowball_entity", snow_snowball_ENTITY) + + + +-- Snowball and Default Snowball Merged + +-- They both look the same, they do basically the same thing (except one is a leftclick throw +-- and the other is a rightclick drop),... Why not combine snow:snowball with default:snow and +-- benefit from both? ~ LazyJ, 2014_04_08 + +--[[ Save this for reference and occasionally compare to the default code for any updates. + +minetest.register_node(":default:snow", { + description = "Snow", + tiles = {"default_snow.png"}, + inventory_image = "default_snowball.png", + wield_image = "default_snowball.png", + is_ground_content = true, + paramtype = "light", + buildable_to = true, + leveled = 7, + drawtype = "nodebox", + freezemelt = "default:water_flowing", + node_box = { + type = "leveled", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.5+2/16, 0.5}, + }, + }, + groups = {crumbly=3,falling_node=1, melts=1, float=1}, + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_snow_footstep", gain=0.25}, + dug = {name="default_snow_footstep", gain=0.75}, + }), + on_construct = function(pos) + if minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name == "default:dirt_with_grass" or minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name == "default:dirt" then + minetest.set_node({x=pos.x, y=pos.y-1, z=pos.z}, {name="default:dirt_with_snow"}) + end + -- Now, let's turn the snow pile into a snowblock. ~ LazyJ + if minetest.get_node({x=pos.x, y=pos.y-2, z=pos.z}).name == "default:snow" and -- Minus 2 because at the end of this, the layer that triggers the change to a snowblock is the second layer more than a full block, starting into a second block (-2) ~ LazyJ, 2014_04_11 + minetest.get_node({x=pos.x, y=pos.y, z=pos.z}).name == "default:snow" then + minetest.set_node({x=pos.x, y=pos.y-2, z=pos.z}, {name="default:snowblock"}) + end + end, + on_use = snow_shoot_snowball -- This line is from the 'Snow' mod, the reset is default Minetest. +}) +--]] + + + +minetest.override_item("default:snow", { + drop = { + max_items = 2, + items = { + {items = {'snow:moss'}, rarity = 20,}, + {items = {'default:snow'},} + } + }, + leveled = 7, + node_box = { + type = "leveled", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.5, 0.5}, + }, + }, + groups = {cracky=3, crumbly=3, choppy=3, oddly_breakable_by_hand=3, falling_node=1, melts=2, float=1}, + sunlight_propagates = true, + --Disable placement prediction for snow. + node_placement_prediction = "", + on_construct = function(pos) + pos.y = pos.y-1 + local node = minetest.get_node(pos) + if node.name == "default:dirt_with_grass" + or node.name == "default:dirt" then + node.name = "default:dirt_with_snow" + minetest.set_node(pos, node) + end + end, + --Handle node drops due to node level. + on_dig = function(pos, node, digger) + local level = minetest.get_node_level(pos) + minetest.node_dig(pos, node, digger) + if minetest.get_node(pos).name ~= node.name then + local inv = digger:get_inventory() + if not inv then + return + end + local left = inv:add_item("main", "default:snow "..tostring(level/7-1)) + if not left:is_empty() then + minetest.add_item({ + x = pos.x + math.random()/2-0.25, + y = pos.y + math.random()/2-0.25, + z = pos.z + math.random()/2-0.25, + }, left) + end + end + end, + --Manage snow levels. + on_place = function(itemstack, placer, pointed_thing) + local under = pointed_thing.under + local oldnode_under = minetest.get_node_or_nil(under) + local above = pointed_thing.above + + if not oldnode_under + or not above then + return + end + + local olddef_under = ItemStack({name=oldnode_under.name}):get_definition() + olddef_under = olddef_under or minetest.nodedef_default + + local place_to + -- If node under is buildable_to, place into it instead (eg. snow) + if olddef_under.buildable_to then + place_to = under + else + -- Place above pointed node + place_to = above + end + + local level = minetest.get_node_level(place_to) + if level == 63 then + minetest.set_node(place_to, {name="default:snowblock"}) + else + minetest.set_node_level(place_to, level+7) + end + + if minetest.get_node(place_to).name ~= "default:snow" then + local itemstack, placed = minetest.item_place_node(itemstack, placer, pointed_thing) + return itemstack, placed + end + + itemstack:take_item() + + return itemstack + end, + on_use = snow_shoot_snowball +}) + + + +--[[ +A note about default torches, melting, and "buildable_to = true" in default snow. + +On servers where buckets are disabled, snow and ice stuff is used to set water for crops and +water stuff like fountains, pools, ponds, ect.. It is a common practice to set a default torch on +the snow placed where the players want water to be. + +If you place a default torch *on* default snow to melt it, instead of melting the snow is +*replaced* by the torch. Using "buildable_to = false" would fix this but then the snow would no +longer pile-up in layers; the snow would stack like thin shelves in a vertical column. + +I tinkered with the default torch's code (see below) to check for snow at the position and one +node above (layered snow logs as the next y position above) but default snow's +"buildable_to = true" always happened first. An interesting exercise to better learn how Minetest +works, but otherwise not worth it. If you set a regular torch near snow, the snow will melt +and disappear leaving you with nearly the same end result anyway. I say "nearly the same" +because if you set a default torch on layered snow, the torch will replace the snow and be +lit on the ground. If you were able to set a default torch *on* layered snow, the snow would +melt and the torch would become a dropped item. + +~ LazyJ + +--]] + + +-- Some of the ideas I tried. ~ LazyJ +--[[ +local can_place_torch_on_top = function(pos) + if minetest.get_node({x=pos.x, y=pos.y, z=pos.z}).name == "default:snow" + or minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name == "default:snow" then + minetest.override_item("default:snow", {buildable_to = false,}) + end + end +--]] + + +--[[ +minetest.override_item("default:torch", { + --on_construct = function(pos) + on_place = function(itemstack, placer, pointed_thing) + --if minetest.get_node({x=pos.x, y=pos.y, z=pos.z}).name == "default:snow" + -- Even though layered snow doesn't look like it's in the next position above (y+1) + -- it registers in that position. Check the terminal's output to see the coord change. + --or minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name == "default:snow" + if pointed_thing.name == "default:snow" + then minetest.set_node({x=pos.x, y=pos.y+1, z=pos.z}, {name="default:torch"}) + end + end +}) +--]] diff --git a/mods/snow/src/stairsplus.lua b/mods/snow/src/stairsplus.lua new file mode 100755 index 00000000..6d4d5e21 --- /dev/null +++ b/mods/snow/src/stairsplus.lua @@ -0,0 +1,342 @@ +-- =============================================================================== +-- StairsPlus Bonus! +-- =============================================================================== +--[[ +This section of code that makes blocks compatible with MoreBlocks' circular saw. +I've added circular saw compatible code for default snowblocks and ice. :D +A big thanks to Calinou and ShadowNinja for making this possible. + +Because StairsPlus creates partial blocks, it didn't seem quite right that the +smallest microblocks would produce a full-sized water_source node when melted. +So I toned them down a bit by changing their melt to a temporary, +2-second water_source. See "melts" in abms.lua file for the various intensities. + +___...::: ATTENTION MINETEST SERVER OPERATORS :::...___ +You may or may not have noticed in your server logs that MoreBlocks stairs/slabs/ +panels/microblocks are not recorded as to when, who, what, and where. This is +important information when trying to determine if a player who dug these blocks +is the owner (the player who placed the block) or is a griefer stealing the block. + +There is an option that will log when these blocks are placed but it comes at the +cost of losing the auto-rotation of those blocks when placed. They can still be +rotated with a screwdriver but if screwdrivers are disabled on your server your +players won't be able to position MoreBlocks, saw-made blocks. + +To enable logging the placement of these blocks, un-comment these lines: + +--on_place = minetest.item_place + +There is one in each of the "stairsplus.register_all" sections. + +~ LazyJ +-- =============================================================================== +--]] + +--snow_stairsplus = {} + +-- Check for infinite stacks + +--if minetest.get_modpath("unified_inventory") or not minetest.setting_getbool("creative_mode") then +-- snow_stairsplus.expect_infinite_stacks = false +--else +-- snow_stairsplus.expect_infinite_stacks = true +--end + + + + + + +-- First, let's run a check to see if MoreBlocks is installed; we're going to need it for the +-- next section of stairsplus stuff. ~LazyJ + +if (minetest.get_modpath("moreblocks")) +and rawget(_G, "stairsplus") + +-- 'If' MoreBlocks was found and stairsplus is available, well, 'then' go ahead with this next part: + +then + +--[[ Leave commented out - For reference only. ~ LazyJ +function stairsplus.register_all(modname, subname, recipeitem, fields) + --stairsplus.register_stair_slab_panel_micro(modname, subname, recipeitem, fields) + stairsplus:register_stair(modname, subname, recipeitem, fields) + stairsplus:register_slab(modname, subname, recipeitem, fields) + stairsplus:register_panel(modname, subname, recipeitem, fields) + stairsplus:register_micro(modname, subname, recipeitem, fields) +end + Leave commented out +--]] + + + +-- Leave commented out. Another, possible piece of the puzzle, as to why the placement of +-- stairsplus nodes aren't recorded in the logs. Shelved till I can concentrate on it again. +-- ~ LazyJ + +--ItemStack({name=nodename}):get_definition() +--itemstack ={} +--[[ + local def = itemstack:get_definition() + function minetest.item_place_node(itemstack, placer, pointed_thing, param2) + minetest.log("action", placer:get_player_name() .. " places node " + .. def.name .. " at " .. minetest.pos_to_string(place_to)) + end + Leave commented out +--]] + + +-- Leave commented out +--[[ FIGURE OUT HOW TO GET THE SLABS TO SHOW UP IN THE LOG ON PLACEMENT + + + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + -- If it's being placed on an another similar one, replace it with + -- a full block + local slabpos = nil + local slabnode = nil + local p0 = pointed_thing.under + local p1 = pointed_thing.above + local n0 = minetest.get_node(p0) + local n1 = minetest.get_node(p1) + local param2 = 0 + + local n0_is_upside_down = (n0.name == "snow:slab_" .. subname and + n0.param2 >= 20) + + if n0.name == "snow:slab_" .. subname and not n0_is_upside_down and p0.y+1 == p1.y then + slabpos = p0 + slabnode = n0 + elseif n1.name == "snow:slab_" .. subname then + slabpos = p1 + slabnode = n1 + end + if slabpos then + -- Remove the slab at slabpos + minetest.remove_node(slabpos) + -- Make a fake stack of a single item and try to place it + local fakestack = ItemStack(recipeitem) + fakestack:set_count(itemstack:get_count()) + + pointed_thing.above = slabpos + local success + fakestack, success = minetest.item_place(fakestack, placer, pointed_thing) + -- If the item was taken from the fake stack, decrement original + if success then + itemstack:set_count(fakestack:get_count()) + -- Else put old node back + else + minetest.set_node(slabpos, slabnode) + end + return itemstack + end + + -- Upside down slabs + if p0.y-1 == p1.y then + -- Turn into full block if pointing at a existing slab + if n0_is_upside_down then + -- Remove the slab at the position of the slab + minetest.remove_node(p0) + -- Make a fake stack of a single item and try to place it + local fakestack = ItemStack(recipeitem) + fakestack:set_count(itemstack:get_count()) + + pointed_thing.above = p0 + local success + fakestack, success = minetest.item_place(fakestack, placer, pointed_thing) + -- If the item was taken from the fake stack, decrement original + if success then + itemstack:set_count(fakestack:get_count()) + -- Else put old node back + else + minetest.set_node(p0, n0) + end + return itemstack + end + + -- Place upside down slab + param2 = 20 + end + + -- If pointing at the side of a upside down slab + if n0_is_upside_down and p0.y+1 ~= p1.y then + param2 = 20 + end + + return minetest.item_place(itemstack, placer, pointed_thing, param2) + end + Leave commented out +--]] + + + +--[[ +Below, in the "groups" line there is a "melts" category. Back in the ABMs lua file, melting +code, melts=1 will produce a water_source when the full-sized snow/ice block is melted making +a big, watery mess. melts=2 will produce a water_source only for a moment, then it changes back +to water_flowing and then dries-up and disappears. I gave these stairs/slabs/panels/microblocks +a melts value of 2 instead of 1 because they are not full blocks. + +~ LazyJ +--]] + +-- Default snowblock and ice stairs/slabs/panels/microblocks. + + local ndef = minetest.registered_nodes["default:ice"] + local groups = {} + for k, v in pairs(ndef.groups) do groups[k] = v end + + stairsplus:register_all("moreblocks", "ice", "default:ice", { + description = ndef.description, + paramtype2 = "facedir", + -- Added "icemaker=1" in groups. This ties into the freezing + -- function in the ABMs.lua file. ~ LazyJ + groups = {cracky=1, crumbly=1, choppy=1, oddly_breakable_by_hand=1, melts=2, icemaker=1}, + sounds = default.node_sound_glass_defaults(), + tiles = ndef.tiles, + -- Because of the "use_texture_alpha" line, that gives ice transparency, I couldn't combine + -- default ice and default snowblocks in a list like MoreBlocks does. ~ LazyJ + use_texture_alpha = true, + sunlight_propagates = true, + -- This "on_place" line makes placing these nodes recorded in the logs. + -- Useful for investigating griefings and determining ownership + -- BUT these nodes will nolonger auto-rotate into position. ~ LazyJ + + --on_place = minetest.item_place, + + -- The "on_construct" part below, thinking in terms of layers, dirt_with_snow could + -- also double as dirt_with_frost which adds subtlety to the winterscape. ~ LazyJ + on_construct = function(pos) + pos.y = pos.y - 1 + if minetest.get_node(pos).name == "default:dirt_with_grass" + or minetest.get_node(pos).name == "default:dirt" then + minetest.set_node(pos, {name="default:dirt_with_snow"}) + end + end + }) +--end + + + local ndef = minetest.registered_nodes["default:snowblock"] + local groups = {} + for k, v in pairs(ndef.groups) do groups[k] = v end + + stairsplus:register_all("moreblocks", "snowblock", "default:snowblock", { + description = ndef.description, + paramtype2 = "facedir", + -- Added "icemaker=1" in groups. This ties into the freezing function + -- in the ABMs.lua file. ~ LazyJ + groups = {cracky=3, crumbly=3, choppy=3, oddly_breakable_by_hand=3, melts=2, icemaker=1}, + tiles = ndef.tiles, + sunlight_propagates = true, + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_snow_footstep", gain=0.25}, + dig = {name="default_dig_crumbly", gain=0.4}, + dug = {name="default_snow_footstep", gain=0.75}, + place = {name="default_place_node", gain=1.0} + }), + -- This "on_place" line makes placing these nodes recorded in the logs. + -- Useful for investigating griefings and determining ownership + -- BUT these nodes will nolonger auto-rotate into position. ~ LazyJ + + --on_place = minetest.item_place, + + -- The "on_construct" part below, thinking in terms of layers, + -- dirt_with_snow could also double as dirt_with_frost + -- which adds subtlety to the winterscape. ~ LazyJ + on_construct = function(pos) + pos.y = pos.y - 1 + if minetest.get_node(pos).name == "default:dirt_with_grass" + or minetest.get_node(pos).name == "default:dirt" then + minetest.set_node(pos, {name="default:dirt_with_snow"}) + end + end + }) + + + +-- Snow stairs/slabs/panels/microblocks. + +local snow_nodes = { + "snow_brick", + "snow_cobble", +} + +for _, name in pairs(snow_nodes) do + local nodename = "snow:"..name + local ndef = minetest.registered_nodes[nodename] + local groups = {} + for k, v in pairs(ndef.groups) do groups[k] = v end + + stairsplus:register_all("moreblocks", name, nodename, { + description = ndef.description, + drop = ndef.drop, + groups = {cracky=2, crumbly=2, choppy=2, oddly_breakable_by_hand=2, melts=2, icemaker=1}, + tiles = ndef.tiles, + --paramtype2 = "facedir", + sunlight_propagates = true, + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_snow_footstep", gain=0.25}, + dig = {name="default_dig_crumbly", gain=0.4}, + dug = {name="default_snow_footstep", gain=0.75}, + place = {name="default_place_node", gain=1.0} + }), + -- This "on_place" line makes placing these nodes recorded in the logs. + -- Useful for investigating griefings and determining ownership + -- BUT these nodes will nolonger auto-rotate into position. ~ LazyJ + + --on_place = minetest.item_place, + + +-- Some attempts to have both, the recording in the logs of the placing of +-- the stairplus stuff *and* have the auto-rotation work. No luck yet. +-- ~ LazyJ + + --[[ + on_place = function (i, p, t) + minetest.item_place(i, p, t, 0) + minetest.rotate_node(i, p, t) + end, + --]] + --[[ + on_place = function (i, p, t) + minetest.rotate_node(i, p, t, 0) + minetest.item_place(i, p, t) + end, + --]] + + + +-- Picking up were we left off... ~ LazyJ + + -- The "on_construct" part below, thinking in terms of layers, dirt_with_snow could + -- also double as dirt_with_frost which adds subtlety to the winterscape. ~ LazyJ + on_construct = function(pos) + pos.y = pos.y - 1 + if minetest.get_node(pos).name == "default:dirt_with_grass" + or minetest.get_node(pos).name == "default:dirt" + then minetest.set_node(pos, {name="default:dirt_with_snow"}) + end + -- Some ideas I've tried. Leaving for future reference till I can figure out a workable solution. ~ LazyJ + --minetest.log("action", sender:get_player_name().." places" ..minetest.get_node(pos).name.. "at" ..minetest.pos_to_string(pos)) + --minetest.log("action", minetest.get_player_name().." places" ..minetest.get_node(pos).name.. "at" ..minetest.pos_to_string(pos)) + --minetest.log("action", "BINGO places "..minetest.get_name().." at "..minetest.pos_to_string(pos)) + --minetest.log("action", minetest.get_player_name().." places "..minetest.get_name().." at "..minetest.pos_to_string(pos)) + --minetest.log("action", placer:get_player_name().." places moreblocks-something at "..minetest.pos_to_string(pos)) + --minetest.log("action", " BINGO places "..minetest.get_pointed_thing().." at "..minetest.pos_to_string(pos)) + --minetest.log("action", "BINGO places moreblocks"..ndef.." at "..minetest.pos_to_string(pos)) + --minetest.log("action", "A pine sapling grows into a Christmas tree at "..minetest.pos_to_string(pos)) + --return minetest.item_place(itemstack, placer, pointed_thing, param2) + --return minetest.item_place(itemstack, pointed_thing, param2) + end, + }) +end + +else -- from clear up at the top, the MoreBlocks check. "Else", if MoreBlocks wasn't found, skip + -- down to here, "return" nothing and "end" this script. ~ LazyJ +return +end diff --git a/mods/snow/src/util.lua b/mods/snow/src/util.lua new file mode 100755 index 00000000..f2dd9f96 --- /dev/null +++ b/mods/snow/src/util.lua @@ -0,0 +1,156 @@ +--Global config and function table. +snow = { + snowball_gravity = 100/109, + snowball_velocity = 19, + sleds = true, + enable_snowfall = true, + lighter_snowfall = false, + debug = false, + smooth_biomes = true, + christmas_content = true, + smooth_snow = true, + min_height = 3, +} + +--Config documentation. +local doc = { + snowball_gravity = "The gravity of thrown snowballs", + snowball_velocity = "How fast players throw snowballs", + sleds = "Disable this to prevent sleds from being riden.", + enable_snowfall = "Enables falling snow.", + lighter_snowfall = "Reduces the amount of resources and fps used by snowfall.", + debug = "Enables debug output. Currently it only prints mgv6 info.", + smooth_biomes = "Enables smooth transition of biomes (mgv6)", + smooth_snow = "Disable this to stop snow from being smoothed.", + christmas_content = "Disable this to remove christmas saplings from being found.", + min_height = "The minumum height a snow biome will generate (mgv7)", +} + +--Manage config. +--Saves contents of config to file. +local function saveConfig(path, config, doc) + local file = io.open(path,"w") + if file then + for i,v in pairs(config) do + local t = type(v) + if t == "string" or t == "number" or t == "boolean" then + if doc and doc[i] then + file:write("# "..doc[i].."\n") + end + file:write(i.." = "..tostring(v).."\n") + end + end + end +end +--Loads config and returns config values inside table. +local function loadConfig(path) + local config = {} + local file = io.open(path,"r") + if file then + io.close(file) + for line in io.lines(path) do + if line:sub(1,1) ~= "#" then + local i, v = line:match("^(%S*) = (%S*)") + if i and v then + if v == "true" then v = true end + if v == "false" then v = false end + if tonumber(v) then v = tonumber(v) end + config[i] = v + end + end + end + return config + else + --Create config file. + return nil + end +end + +minetest.register_on_shutdown(function() + saveConfig(minetest.get_modpath("snow").."/config.txt", snow, doc) +end) + +local config = loadConfig(minetest.get_modpath("snow").."/config.txt") +if config then + for i,v in pairs(config) do + if type(snow[i]) == type(v) then + snow[i] = v + end + end +else + saveConfig(minetest.get_modpath("snow").."/config.txt", snow, doc) +end + +for i,v in pairs(snow) do + local t = type(v) + if t == "string" + or t == "number" + or t == "boolean" then + local v = minetest.setting_get("snow_"..i) + if v ~= nil then + if v == "true" then v = true end + if v == "false" then v = false end + if tonumber(v) then v = tonumber(v) end + snow[i] = v + end + end +end + + +--MENU + +local get_formspec = function() + local p = -0.5 + local formspec = "label[0,-0.3;Settings:]" + for i,v in pairs(snow) do + local t = type(v) + if t == "string" + or t == "number" then + p = p + 1.5 + formspec = formspec.."field[0.3,"..p..";2,1;snow:"..i..";"..i..";"..v.."]" + elseif t == "boolean" then + p = p + 0.5 + formspec = formspec.."checkbox[0,"..p..";snow:"..i..";"..i..";"..tostring(v).."]" + end + end + p = p + 1 + formspec = "size[4,"..p..";]\n"..formspec + return formspec +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "snow:menu" then + return + end + for i,v in pairs(snow) do + local t = type(v) + if t == "string" or t == "number" or t == "boolean" then + local field = fields["snow:"..i] + if field then + if t == "string" then + snow[i] = field + end + if t == "number" then + snow[i] = tonumber(field) + end + if t == "boolean" then + if field == "true" then + snow[i] = true + elseif field == "false" then + snow[i] = false + end + end + end + end + end +end) + + +minetest.register_chatcommand("snow", { + description = "Show a menu for various actions", + privs = {server=true}, + func = function(name) + minetest.chat_send_player(name, "Showing snow menu…") + minetest.show_formspec(name, "snow:menu", get_formspec()) + end, +}) diff --git a/mods/snow/textures/character_snow_man.png b/mods/snow/textures/character_snow_man.png new file mode 100755 index 0000000000000000000000000000000000000000..9b72766f4c8f64ec7d556f9317ee3d67f92e62c5 GIT binary patch literal 1630 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 T`8h7<00000NkvXXu0mjfi(iZN literal 0 HcmV?d00001 diff --git a/mods/snow/textures/character_snow_man_preview_back.png b/mods/snow/textures/character_snow_man_preview_back.png new file mode 100755 index 0000000000000000000000000000000000000000..672bc2de2d891876c6634b26d2e48b6b31d4aab6 GIT binary patch literal 3359 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 literal 0 HcmV?d00001 diff --git a/mods/snow/textures/default_ice.png b/mods/snow/textures/default_ice.png new file mode 100755 index 0000000000000000000000000000000000000000..afeb3234320bfb3eabdf30f85aba7a6e00df6c15 GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoB=)|uH`HL_wD}=1QE>EM}dOO zB|(0{^XJc>6`(8(VIEGX(p1rV8kik&k@PW<0^?yBVW}cbBqVytFZg0Z+N4p)~ vFYSNx<)nw*iE`1s2bllfw>^LH{wwAw6%5Xi_6h5OhA?=#`njxgN@xNA77RDM literal 0 HcmV?d00001 diff --git a/mods/snow/textures/default_snowball.png b/mods/snow/textures/default_snowball.png new file mode 100755 index 0000000000000000000000000000000000000000..bbe5351e1b97cfe6ccdc695d704886f1156e86d8 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`vpiiKLn?0Fon*;($Uwwp=YLZR z22);lQr7)&JOhnk#N8?``?a{l6G^?1ipsY?${R=t>4p LS3j3^P60!FfY5bFpsLVppJr= zuA;bvzO1RbjJbx4jJcA%zM`X{vZB4Zw}pnUjdp~qVZ4`VvaflnzeR4CeQ~r?S&UP8 ztaE*`M{9;pN49TQj{l5`i21cKz3gs=Kr0wag8YIR9G=}s19Ad9T^vIyZmm6G$<(00 z!{8{Oe?VJEbi)7r!5cl6Y%1I>`!Tud$D}av-Im$cpMG^``C#4M{qmf2n=$h@mf|W0 qK_5kX4<=(amkbG)@YP%hJopVP^$2o59o7&t;ucLK6TOphmR- literal 0 HcmV?d00001 diff --git a/mods/snow/textures/snow_dandelion_white.png b/mods/snow/textures/snow_dandelion_white.png new file mode 100755 index 0000000000000000000000000000000000000000..336e893992f492ecec5821aadb42996fca811a3a GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`j-D=#Ar*|t3k)S#r>~#ip2%gQ zY*5Me=GN|BCFT{+c{eqBN^z$eJ~Z#{HDZ3|bLyx6Mn(mnZO3+S?EZhnfMt0a1N)(X V(%9oC`hkWqc)I$ztaD0e0s!Z1CtCmj literal 0 HcmV?d00001 diff --git a/mods/snow/textures/snow_dandelion_yellow.png b/mods/snow/textures/snow_dandelion_yellow.png new file mode 100755 index 0000000000000000000000000000000000000000..3ebb9e62bb4681d4a82fc319523f053bbcfb9672 GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ww^AIAr*|t3k)S#^Vc6RV4Wp6 z!-u&~XTb@ESC!2*36qXFMf#k{JNw`M1KW?YNy`4p9LIlIH}EdFArOzopr0A3X(DF6Tf literal 0 HcmV?d00001 diff --git a/mods/snow/textures/snow_geranium.png b/mods/snow/textures/snow_geranium.png new file mode 100755 index 0000000000000000000000000000000000000000..33b809d1900d51174a5e3d1f86d6add40645b248 GIT binary patch literal 269 zcmV+o0rLKdP)Ned^i*&c>M>v z#`_S1fzv6{V`BZCXa5(UzWjgT=}Z5~j?VtNH1af8XNUZU836J>*@nOjpqUo{Pz6`W TC|=kC00000NkvXXu0mjf4WDm1 literal 0 HcmV?d00001 diff --git a/mods/snow/textures/snow_ice_brick.png b/mods/snow/textures/snow_ice_brick.png new file mode 100755 index 0000000000000000000000000000000000000000..a28fcce40c1f47983ec5f941a58ef894ce21c9d4 GIT binary patch literal 665 zcmV;K0%rY*P)zi zRoi#RVW4;e2MU~0TOF5f&?$m*oF2^2Oz}Cql#fqOBON^DWjo?)z(PrZD%4rEaQs?E zFc86-k73sjVrNj-@b2RmL;EtO2U|KbfiClv7Y{+G8|6jCe(9M4Dgv#*>*cuvj}8_T zTf#z$AQL)jc1by|ecdZ&JAgft2)tY%BbZWPp5*%}zBz0lrN{_4Jk_bRSkM)W{!> z1q0R#Z2%z{@wbP;P{dcacUZQqIaSAk2I$#C;qo_TXv-(CNHAXN5w{s z6ktI@5C5 z75gjIpZm30dFgtwHXcbC9Y{wZBqSy>GYp)&IiJ@MCzr~(kWs(yJ(pJ}%(VoAUVrJaR20z=O-eS4q-p^KpMTv1AEONI`nWVeH{oRa&zRFF_&Cg#tI!rKg lkh5UjDz#{KNT$NvdX73SCacx9_kk8Mc)I$ztaD0e0swxOMHT=6 literal 0 HcmV?d00001 diff --git a/mods/snow/textures/snow_moss.png b/mods/snow/textures/snow_moss.png new file mode 100755 index 0000000000000000000000000000000000000000..a04805754671f04c214a106922a07f2b5c233869 GIT binary patch literal 619 zcmV-x0+juUP)pGHOYxNlgrm>5C*v zlaiR0c#BDi_rw=}*0^jVXn{_09?s0<%Qtfl@h`-}6o?_9?5787PL@Ow?Sgea+f6${yJ_j;GrTXnhPIo-xDj(H-i%e5q9D@M@RE!52v(=UF4%+$3UY z8cPC&ze8#}F1&28{V`rQ7g5;MLVnJn8I$s}#AvFFfh)fwIz7U3dE4 z-cFw$r4}}#u?C;Rmmd00UDU6As9_!cO$bGjn>4|?U9{8PI!8yJ5% zM(3^#Csz= zyq_iZcMDLpe(1da6;oW_VaBSf3@7G3i(}Id>7(DlIPMva> z4T5PB6m<~e!a;7-;7WpBvil}_pAxPtL51^%d>4Ez?`JeGMOfsrxIa~3BL3K6yb|PH z2T-YnN@}CN_CVcmF#C$ippNHSoJs^ojT_={wDDk_XoR;Bbz)@Bd#Np4NiNCQxg2S! znvn7-Ub80DG}Bt5QC>QzuRNhTPem$iEvHh1t1!3FeT)$dHE0%Z)RFMiiy?%IH0amDYj^J z?INCN_)PKPvOKk@VpA3=Pd5Dv)5_cyDCL!lBctTVEJ#kDx^gc=EfD4dWjW%tvGK(I u^Xoa?;}wd3d>*BhS?0%Ena~~omHz;E!7abNr}B~j00003yD^vLAqKJ~8XirDTuvLPX=r~x>i@W@ugf8lCo5Y-|!UA20*nd(swxurB#3*#=lEkDcWebna_oK+vC z)hxnUQ!Ro+W=C5?F9sP5^DJ*>sMkYO7L$Z#!+07R;h6~0ZUn8NGQAXMbxR7g*D}oY z0#p`sPCTAv_xU29zh33X_uG8ETjisj8n2!zu=!+;e{LT;C2{)Avn4*eFwNcf+KBxZ zN?biN$?dnBe6`o&iz`i&_{qV=G6yf0x%NthZ!g#Q@=Aj{`z?Mt=x}ql#Bs&FQH`}u_H(NZW2LR6=t{_A?$HCsbfh?v26JGe$L5*j*Xi$ ziYbr{$xn5pU5LE|;?D`hZw17K7+G_~qOKxz52_r|aACqQIx6@2F8-Reacjm&dp5*q zLzMy^#5-}bGUEOb0&i%DISEfQj8pby-Gx?&#H5R@p2}XwO}p(Ua%7B=md2QQ>v|G< zF~r#zi5WN1qj9Vs#e}n}B8(s+=0TCheYlbDDs|23-Px7~x<^Bn7nDaQR6SZw+>c~SWmZ}vx_Nd?3AI@4ta_pO_zIiS>RtPSAC#QBiQc%0000< KMNUMnLSTY{_Noa0 literal 0 HcmV?d00001 diff --git a/mods/snow/textures/snow_needles_decorated_animated.png b/mods/snow/textures/snow_needles_decorated_animated.png new file mode 100755 index 0000000000000000000000000000000000000000..8bccbd35abaeb54320c671d3d2baf0589e24cb48 GIT binary patch literal 1594 zcmV-A2F3Y_P)EK|000I7Nkl=qk@WzN=F!l5uuvDzI|D1e|sy{2q9L~pqfc! zH!mZ%HjUB6C{$q-(Y6Ui&p;^%woW5nU0z7k{7nOq&Ow`EpeG#>GaF^3my$%5kj6we zE}lDK+{9{_I}wal55gj_0)>PD{C?wVrOJW%jVvNhni$Cr3kK+s?ThDFJQqQ9A%aj{ z$INOB>sN`OwUNeRJAl%%iKm{;VE5%bzJ0fh-#%*Lm)$Zxy;Z^6y$NhRm&M=rFZRf; zE2=Ki+9D@Qb}Si`aXkhuDCFI=0zYuBgn z{6-3E&txz$tz+Pqq9vTW)?6#1$j1C5X@Vwilc8>e?2?wJ7mvtf+Xba)b81Uh3d zJF$bsb=5-9$WluQxJ(WC%W10?#G|c-CEqds(PBeUSNwSE1_onZBrhg}5xob%{$K1F z$OIXKhU!Xb_F@xkhEuF)SjzN4rxa~3PgW%u0DA_u<_!$hbt3Q`DK;6!B2B^92*XYD zl3Jk3B1#En&!ET?!#LLrVVJ9~ZOAt!j?Z}!Js*Q?6f$C^kyL|F12Aq!A#Vn-#-1=JL!Qv&2~MoMj^of*gNWhEzQn)prAOI zy^|i;(tL_~z}xy{dhqiH&6Dc^vz~c9;F9Jb{{Lt_;6~p69Ne!5Ou#+&>%o!JhQSPE z>(>JgvPkTDU_WiFp|Txc4{WE++1G;|(u3Zq>H#-e_k$fLJ+Pe(j(Wg7^xqGXc0I72 z4JW%F*v^Lk=YH@x*>~^VEc~k;{Q0=|gA0dxFn1h1*djZBntBkl^uV}eN)}{0qnLHl z1J1FPZ%Yr_mL6D@%HJP#KiJ_tVU=~i9`JWt2hR6{_>=~V09zg$+ z@E|--)We7edVXad&|WPb&|WPb&|XiU7qDeVJizOS{eVj}-~k;g_5&`_hzEEbiTyy! zy5k4nf!dxQ=<@^f09Nk(-uP(ctAB5Vm4|-7@4#98pz=cHg~|(+7bsH}4=7XQ0mDU? z2b3xD0O7*p0mDUN9%wu7@&JCY9S<~EULMdfJRabCZSjDP@r(zI${r68l|3FXDwiLW zACw=IA0)0v0{6Xoq|Eios7G2-pZK$tA7rdYf}MKxNU&3n2ei|x)gzT3lpmBIlpmzH zzi`WWe_?-nL2dj0Kj!4jLIVStsc&;H!<@sJ;n4rN49h*x z@o`@4^+Y|K!ns)U39{RTSjvQ44dL7Zsj%~>bd49tCpVHXiTlOn)SG|~1BC>M0b(88 z69@DQfo-9ZtQN0ZTs*HCgm9%p@&`>&YT%i9rEqW7nN-V?IAf5bfwqQ3g3J_=`BRR8 zT?*4$lWI&}qQi0qQiK<&d)q8b=QOPvr0rfX+H7vu_`IE=K!%lJLn;Hq*EI*^-`Oy~FVdQ&MBb@ E0D;3s5&!@I literal 0 HcmV?d00001 diff --git a/mods/snow/textures/snow_shrub_covering.png b/mods/snow/textures/snow_shrub_covering.png new file mode 100755 index 0000000000000000000000000000000000000000..8d7d05bdf5d911ba627a0fd2ce1771ed10fa2562 GIT binary patch literal 229 zcmV^P)Tg+c>eDO`gKx~^Z&`k&i@zHdHvte8Hl2BQN1^&0sZ+-|GRSR|M%oMfNTUi z9jFjpBaFuG{MK~a|5J*c{}Ip##>prN3?T`}0rskb*fin@b%Z2t8+D0G(&!pVP3I(Q Z1OQl4;v2?hc546t002ovPDHLkV1l~)pzZ(w literal 0 HcmV?d00001 diff --git a/mods/snow/textures/snow_snow_brick.png b/mods/snow/textures/snow_snow_brick.png new file mode 100755 index 0000000000000000000000000000000000000000..c5d640c6ae188a3ddb9f0d294c68cdb8f4d51d47 GIT binary patch literal 319 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}et=JitBj1MtgMcLf`O8fk&=?J zii(-4DiE1#Xjtp$IO^#+>+8E28~d1;_?nvfSz3lzS%uozMA+I!IXNXcJ14ukrn$ML zdwJz~d*}K16!`m>hKDyqMz%ynwI(M|+`jY5vEx^O;O_nZ??3zpg4+F8+ksYhd%8G= zNJz3CWOq7jz`$})d0|VEq|^FMMziAA9-w`={R@K9pDewmA}}t-EcHn=6Z8 z1d{@5quEL^E`<-1uWdW3RV65@8Fo;RVIk9l+Pvetbj*`&_SwYtKmV!~(8{;KAtR8J zL+BRM9&U|Bv8OqK93m}STemR^RI#s0nf-gt?|t&ybI zx9E?k-ByFN`1=0+{r||+_f~_pU5mB6%i_@6>e}M&-sbV8y6BCk+){qDQ+%@5-}=GM z_Q%urQhcZ^xAUR5^PaTyOL4JIbFu61{L0n$+~fMAx$~>P^j(j&OmMJDY_Lmkuu5&P ztiSZn+WDor^QOD=PNnA2y8#Y%9nN^Y+t;G<@%+%^qH{p@bmuk_WtSa{P6Pq z)ZY0{c(LZ{`(u{3+Tr?5bFocyvD4f1xykOKw&z!fwNG`hnXlHRxY(39wC4Z-0M1E7 zK~xwS1;M>a0st5Q!0&{RFiF}X5R#?{+xmkbXsRKk*$3zWBv7a^tZ*{g+8PU7jJ62f zvIfm?sc5WO3!J(W0RaKh!!!bbIRId25rde`c%7f}8{Z}(Qn_B_yRi(<);+DDzeGDC zHf;lNzr&B+B<~9XLQn+ouo@}14z8jwlVF?#7dF=Fdxl!SG@h(~CJwFIIEBoWuNbKF7<|9IqC!y;{fldMVrMW&E#K za=%%_@pc{O+jU%T*YUnx$NzSnz}s~~Z`TRGT_=9?&DyCzH!+q3`2{mLJiCzwMf~Y+El{9^YDAJFVGSOPgg&ebxsLQ0GCjSAOHXW literal 0 HcmV?d00001 diff --git a/mods/snow/textures/snow_star_lit.png b/mods/snow/textures/snow_star_lit.png new file mode 100755 index 0000000000000000000000000000000000000000..a72ca87c5714933ddd0b365fe94a6e29ff0e490c GIT binary patch literal 302 zcmV+}0nz@6P)_&j!JGNW71h{|0W=%?gT7u;YsU3cS#R5|N0p8gLHXt7M#Q*>R07*qoM6N<$g2rus AfdBvi literal 0 HcmV?d00001 diff --git a/mods/snow/textures/snow_tulip.png b/mods/snow/textures/snow_tulip.png new file mode 100755 index 0000000000000000000000000000000000000000..321429d99dd779098dd56f8ad15785c6a5ad5e05 GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&YmugAr*|t5^oYj=5!|}{D|UQ zbkdBW?PWd#)0x7h1~NXEB2HX>Vcy-##4ONufOo~Iu3!G^7zNIzFrDK4u*vw?YDos; Xf07?>TV?(M8pq)2>gTe~DWM4fn*}ND literal 0 HcmV?d00001 diff --git a/mods/snow/textures/snow_viola.png b/mods/snow/textures/snow_viola.png new file mode 100755 index 0000000000000000000000000000000000000000..95d2871a98c023f38e017fa40680a859f6500256 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Hl8kyAr*|t3T!=1fdNthzT4bN zeC8?UzO4O!@+!}<+soen;y;v9z0|_zrM+w8j@9RX+PltjoS_shaEXWE)Eni+i>{}| Q1I=OZboFyt=akR{0KEh#X8-^I literal 0 HcmV?d00001 diff --git a/mods/snow/textures/snow_xmas_tree.png b/mods/snow/textures/snow_xmas_tree.png new file mode 100755 index 0000000000000000000000000000000000000000..d787d37c36bf547af1551c66708bc508d156160f GIT binary patch literal 299 zcmV+`0o4A9P)tG1mXWc4CfOE9K^vIp_=}~3<8N04-5rin*XC|CfyJQWgZYso@RX&X^0Cn`4||C zg#Htw6{HZX$)VXbLJAo8ifKP}kkpBPw|I(ZD?*dtj zB|(0{3=Yq3qygDqJY5_^DsH{Ky*KxegG9r_{skPJhw=*AU8F0Sw2p9S8gVc$`JgeS z=b%Q<1fx{Gq-248^6#vZ6y661Jn=2EpVT{9SP5t*c2H2iY*o&bRXI8#mPdK6RDUR8 z^Y%51yEbc&eA4QZo@op2GV857VJoq-{>a4F_s!OQTR%Cwc=xUQVA=nHTxwfwoHbU){}ehbH&>f8SQI>CWL` z)&}p7>SbH+EARYJQ@HZkRnbVRJhA7_6`M-#taH1b@-UC>j*$PYvr3y!)P$_qwBwwz z6VM75`I`(5?~k=#4@{Z%Of9qa(zle%yh)X!)4}dxD9BuNs)%3SIp93db^MvjPkpQZ z$dO+Z!;<=2Njx=To7VDKI{e=+&PiN)^4RO3$-Nh^{XD)#{kpTr z#hr0a&eYwkC|X+}zg+a*f&n}6`@ SQ?5&(So3uCb6Mw<&;$Ui;1iSp literal 0 HcmV?d00001