From e0da0347c5778c8b3fa57d04ee336aa4c013db4a Mon Sep 17 00:00:00 2001 From: HybridDog Date: Sat, 6 Jun 2015 11:59:36 +0200 Subject: [PATCH 1/3] add a mod update script --- update_mods.sh | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 update_mods.sh diff --git a/update_mods.sh b/update_mods.sh new file mode 100644 index 0000000..2bcbd78 --- /dev/null +++ b/update_mods.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +load_mod() { + wget https://github.com/$2/$4/archive/$3.zip -O $1.zip + unzip $1.zip + rm $1.zip + mv $4-$3 $1 +} + +load_usual_mod() { + load_mod $1 $2 master $1 +} + +load_hmod() { + load_usual_mod $1 HybridDog +} + +# make folder +mkdir tmp +cd tmp + +# download mods +echo "loading mods…" +for i in builtin_item item_drop; do + load_hmod $i +done +load_mod snow Splizard master minetest-mod-snow + +# move mods +echo "moving mods…" +for i in $(ls); do + trash ../mods/$i + mv $i ../mods/$i +done +cd .. +rm -R tmp + +echo "done!" From eb25e834d9e8898f8b73bafe0e743ee60e045577 Mon Sep 17 00:00:00 2001 From: HybridDog Date: Sat, 6 Jun 2015 12:00:51 +0200 Subject: [PATCH 2/3] used the script --- mods/builtin_item/.gitignore | 4 + mods/builtin_item/init.lua | 329 ++++---- mods/item_drop/.gitignore | 4 + mods/item_drop/init.lua | 109 +-- mods/snow/.gitignore | 3 + mods/snow/LazyJ-changelog.txt | 162 ++++ mods/snow/changelog.txt | 67 ++ mods/snow/config.lua | 10 - mods/snow/depends.txt | 1 + mods/snow/init.lua | 722 ++++-------------- mods/snow/mapgen.lua | 304 -------- mods/snow/models/sled.blend | Bin 0 -> 430048 bytes mods/snow/models/sled.png | Bin 0 -> 4168 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_brick_lazyJ.png | Bin 0 -> 518 bytes .../other_textures/snow_snow_cobble.png_01 | Bin 0 -> 788 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 | 100 +-- mods/snow/schematics/pine.mts | Bin 0 -> 99 bytes mods/snow/src/abms.lua | 204 +++++ mods/snow/src/aliases.lua | 104 +++ mods/snow/src/basic_stairs_slabs.lua | 326 ++++++++ mods/snow/src/crafting.lua | 234 ++++++ mods/snow/src/falling_snow.lua | 234 ++++++ mods/snow/src/mapgen.lua | 181 +++++ mods/snow/src/mapgen_v6.lua | 351 +++++++++ mods/snow/src/mapgen_v7.lua | 138 ++++ mods/snow/src/nodes.lua | 351 +++++++++ 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 -> 27318 bytes .../character_snow_man_preview_back.png | Bin 0 -> 25131 bytes mods/snow/textures/default_ice.png | Bin 0 -> 643 bytes mods/snow/textures/default_snowball.png | Bin 0 -> 211 bytes mods/snow/textures/snow_ice.png | Bin 742 -> 0 bytes mods/snow/textures/snow_moss.png | Bin 807 -> 619 bytes mods/snow/textures/snow_needles.png | Bin 860 -> 660 bytes mods/snow/textures/snow_needles_decorated.png | Bin 937 -> 884 bytes .../snow_needles_decorated_animated.png | Bin 0 -> 1594 bytes mods/snow/textures/snow_sapling_pine.png | Bin 406 -> 272 bytes mods/snow/textures/snow_sled.png | Bin 0 -> 327 bytes mods/snow/textures/snow_snow.png | Bin 345 -> 0 bytes mods/snow/textures/snow_snow_brick.png | Bin 507 -> 319 bytes mods/snow/textures/snow_snow_cobble.png | Bin 0 -> 737 bytes mods/snow/textures/snow_snow_side.png | Bin 894 -> 0 bytes mods/snow/textures/snow_snowball.png | Bin 372 -> 0 bytes mods/snow/textures/snow_snowfall.png | Bin 350 -> 0 bytes mods/snow/textures/snow_star.png | Bin 540 -> 349 bytes mods/snow/textures/snow_star_lit.png | Bin 0 -> 302 bytes mods/snow/textures/snow_xmas_tree.png | Bin 439 -> 299 bytes mods/snow/textures/weather_snow.png | Bin 0 -> 588 bytes 83 files changed, 4279 insertions(+), 1169 deletions(-) create mode 100644 mods/builtin_item/.gitignore create mode 100644 mods/item_drop/.gitignore create mode 100644 mods/snow/.gitignore create mode 100644 mods/snow/LazyJ-changelog.txt create mode 100644 mods/snow/changelog.txt delete mode 100644 mods/snow/config.lua delete mode 100644 mods/snow/mapgen.lua create mode 100644 mods/snow/models/sled.blend create mode 100644 mods/snow/models/sled.png create mode 100644 mods/snow/models/sled.x create mode 100644 mods/snow/other_textures/connected_textures_ice.png create mode 100644 mods/snow/other_textures/default_ice.png create mode 100644 mods/snow/other_textures/default_ice.xcf create mode 100644 mods/snow/other_textures/inkscape_default_ice.svg create mode 100644 mods/snow/other_textures/mocha.png create mode 100644 mods/snow/other_textures/mocha.xcf create mode 100644 mods/snow/other_textures/original_snow_snow_brick.png create mode 100644 mods/snow/other_textures/rect2985.png create mode 100644 mods/snow/other_textures/snow_ice.png create mode 100644 mods/snow/other_textures/snow_needles_decorated_animated.xcf create mode 100644 mods/snow/other_textures/snow_snow.png create mode 100644 mods/snow/other_textures/snow_snow_brick.xcf create mode 100644 mods/snow/other_textures/snow_snow_brick_lazyJ.png create mode 100644 mods/snow/other_textures/snow_snow_cobble.png_01 create mode 100644 mods/snow/other_textures/snow_snow_cobble.xcf create mode 100644 mods/snow/other_textures/snow_snow_side.png create mode 100644 mods/snow/other_textures/snow_snowball.png create mode 100644 mods/snow/other_textures/snow_snowfall.png create mode 100644 mods/snow/other_textures/snow_star_lit.xcf create mode 100644 mods/snow/other_textures/xdefault_cobble.png create mode 100644 mods/snow/other_textures/xdefault_furnace_bottom.png create mode 100644 mods/snow/other_textures/xdefault_furnace_fire_bg.png create mode 100644 mods/snow/other_textures/xdefault_furnace_fire_fg.png create mode 100644 mods/snow/other_textures/xdefault_furnace_front.png create mode 100644 mods/snow/other_textures/xdefault_furnace_front_active.png create mode 100644 mods/snow/other_textures/xdefault_furnace_side.png create mode 100644 mods/snow/other_textures/xdefault_furnace_top.png create mode 100644 mods/snow/other_textures/xdefault_glass.png create mode 100644 mods/snow/other_textures/xdefault_ice.png create mode 100644 mods/snow/other_textures/xdefault_ice.xcf create mode 100644 mods/snow/other_textures/xdefault_snow.png create mode 100644 mods/snow/other_textures/xdefault_stone_brick.png create mode 100644 mods/snow/schematics/pine.mts create mode 100644 mods/snow/src/abms.lua create mode 100644 mods/snow/src/aliases.lua create mode 100644 mods/snow/src/basic_stairs_slabs.lua create mode 100644 mods/snow/src/crafting.lua create mode 100644 mods/snow/src/falling_snow.lua create mode 100644 mods/snow/src/mapgen.lua create mode 100644 mods/snow/src/mapgen_v6.lua create mode 100644 mods/snow/src/mapgen_v7.lua create mode 100644 mods/snow/src/nodes.lua create mode 100644 mods/snow/src/sled.lua create mode 100644 mods/snow/src/snowball.lua create mode 100644 mods/snow/src/stairsplus.lua create mode 100644 mods/snow/src/util.lua create mode 100644 mods/snow/textures/character_snow_man.png create mode 100644 mods/snow/textures/character_snow_man_preview.png create mode 100644 mods/snow/textures/character_snow_man_preview_back.png create mode 100644 mods/snow/textures/default_ice.png create mode 100644 mods/snow/textures/default_snowball.png delete mode 100644 mods/snow/textures/snow_ice.png create mode 100644 mods/snow/textures/snow_needles_decorated_animated.png create mode 100644 mods/snow/textures/snow_sled.png delete mode 100644 mods/snow/textures/snow_snow.png create mode 100644 mods/snow/textures/snow_snow_cobble.png delete mode 100644 mods/snow/textures/snow_snow_side.png delete mode 100644 mods/snow/textures/snow_snowball.png delete mode 100644 mods/snow/textures/snow_snowfall.png create mode 100644 mods/snow/textures/snow_star_lit.png create mode 100644 mods/snow/textures/weather_snow.png diff --git a/mods/builtin_item/.gitignore b/mods/builtin_item/.gitignore new file mode 100644 index 0000000..d9c069a --- /dev/null +++ b/mods/builtin_item/.gitignore @@ -0,0 +1,4 @@ +## Generic ignorable patterns and files +*~ +.*.swp +debug.txt diff --git a/mods/builtin_item/init.lua b/mods/builtin_item/init.lua index 14f2288..e08e2b3 100644 --- a/mods/builtin_item/init.lua +++ b/mods/builtin_item/init.lua @@ -1,181 +1,168 @@ -minetest.register_entity(":__builtin:item", { - initial_properties = { - hp_max = 1, - physical = true, - collisionbox = {-0.17,-0.17,-0.17, 0.17,0.17,0.17}, - visual = "sprite", - visual_size = {x=0.5, y=0.5}, - textures = {""}, - spritediv = {x=1, y=1}, - initial_sprite_basepos = {x=0, y=0}, - is_visible = false, - timer = 0, - }, - - itemstring = '', - physical_state = true, +local time = tonumber(os.clock())+10 +local lastpos = vector.zero or {x=0, y=0, z=0} +local last_tab, always_test - set_item = function(self, itemstring) - self.itemstring = itemstring - local stack = ItemStack(itemstring) - local itemtable = stack:to_table() - local itemname = nil - if itemtable then - itemname = stack:to_table().name +if not core.get_gravity then + local gravity,grav_updating = 10 + function core.get_gravity() + if not grav_updating then + gravity = tonumber(core.setting_get("movement_gravity")) or gravity + grav_updating = true + core.after(50, function() + grav_updating = false + end) end - local item_texture = nil - local item_type = "" - if minetest.registered_items[itemname] then - item_texture = minetest.registered_items[itemname].inventory_image - item_type = minetest.registered_items[itemname].type + return gravity + end + local set_setting = core.setting_set + function core.setting_set(name, v, ...) + if name == "gravity" then + name = "movement_gravity" + gravity = tonumber(v) or gravity end - prop = { - is_visible = true, - visual = "sprite", - textures = {"unknown_item.png"} - } - if item_texture and item_texture ~= "" then - prop.visual = "sprite" - prop.textures = {item_texture} - prop.visual_size = {x=0.50, y=0.50} - else - prop.visual = "wielditem" - prop.textures = {itemname} - prop.visual_size = {x=0.20, y=0.20} - prop.automatic_rotate = math.pi * 0.25 + return set_setting(name, v, ...) + end + local get_setting = core.setting_get + function core.setting_get(name, ...) + if name == "gravity" then + name = "movement_gravity" end - self.object:set_properties(prop) - end, + return get_setting(name, ...) + end +end - get_staticdata = function(self) - --return self.itemstring - return minetest.serialize({ - itemstring = self.itemstring, - always_collect = self.always_collect, - timer = self.timer, +local function get_nodes(pos) + if not always_test then + local rnd_pos = vector.round(pos) + local t = tonumber(os.clock()) + if vector.equals(rnd_pos, lastpos) + and t-time < 10 then + return last_tab + end + time = t + lastpos = rnd_pos + local near_objects = minetest.get_objects_inside_radius(pos, 1) + if #near_objects >= 2 then + always_test = true + minetest.after(10, function() always_test = false end) + end + end + local tab,n = {},1 + for i = -1,1,2 do + for _,p in pairs({ + {x=pos.x+i, y=pos.y, z=pos.z}, + {x=pos.x, y=pos.y, z=pos.z+i} + }) do + tab[n] = {p, minetest.get_node(p)} + n = n+1 + end + end + if not always_test then + last_tab = tab + end + return tab +end + +local function get_flowing_dir(pos) + local data = get_nodes(pos) + local param2 = minetest.get_node(pos).param2 + if param2 > 7 then + return + end + for _,i in pairs(data) do + local nd = i[2] + local name = nd.name + local par2 = nd.param2 + if name == "default:water_flowing" + and par2 < param2 then + return i[1] + end + end + for _,i in pairs(data) do + local nd = i[2] + local name = nd.name + local par2 = nd.param2 + if name == "default:water_flowing" + and par2 >= 11 then + return i[1] + end + end + for _,i in pairs(data) do + local nd = i[2] + local name = nd.name + local par2 = nd.param2 + local tmp = minetest.registered_nodes[name] + if tmp + and not tmp.walkable + and name ~= "default:water_flowing" then + return i[1] + end + end +end + +local item_entity = minetest.registered_entities["__builtin:item"] +local old_on_step = item_entity.on_step or function()end + +item_entity.on_step = function(self, dtime) + old_on_step(self, dtime) + + local p = self.object:getpos() + + local name = minetest.get_node(p).name + if name == "default:lava_flowing" + or name == "default:lava_source" then + minetest.sound_play("builtin_item_lava", {pos=p}) + minetest.add_particlespawner({ + amount = 3, + time = 0.1, + minpos = {x=p.x, y=p.y, z=p.z}, + maxpos = {x=p.x, y=p.y+0.2, z=p.z}, + minacc = {x=-0.5,y=5,z=-0.5}, + maxacc = {x=0.5,y=5,z=0.5}, + minexptime = 0.1, + minsize = 2, + maxsize = 4, + texture = "smoke_puff.png" + }) + minetest.add_particlespawner ({ + amount = 1, time = 0.4, + minpos = {x = p.x, y= p.y + 0.25, z= p.z}, + maxpos = {x = p.x, y= p.y + 0.5, z= p.z}, + minexptime = 0.2, maxexptime = 0.4, + minsize = 4, maxsize = 6, + collisiondetection = false, + vertical = false, + texture = "fire_basic_flame.png", }) - end, - - on_activate = function(self, staticdata, dtime_s) - if string.sub(staticdata, 1, string.len("return")) == "return" then - local data = minetest.deserialize(staticdata) - if data and type(data) == "table" then - self.itemstring = data.itemstring - self.always_collect = data.always_collect - self.timer = data.timer - if not self.timer then - self.timer = 0 - end - self.timer = self.timer+dtime_s - end - else - self.itemstring = staticdata - end - self.object:set_armor_groups({immortal=1}) - self.object:setvelocity({x=0, y=2, z=0}) - self.object:setacceleration({x=0, y=-10, z=0}) - self:set_item(self.itemstring) - end, - - on_step = function(self, dtime) - local time = minetest.setting_get("remove_items") - if not time then - time = 300 - end - if not self.timer then - self.timer = 0 - end - self.timer = self.timer + dtime - if time ~= 0 and (self.timer > time) then - self.object:remove() - end - - local p = self.object:getpos() - - local name = minetest.env:get_node(p).name - if name == "default:lava_flowing" or name == "default:lava_source" then - minetest.sound_play("builtin_item_lava", {pos=self.object:getpos()}) - self.object:remove() - return - end - - if minetest.registered_nodes[name].liquidtype == "flowing" then - get_flowing_dir = function(self) - local pos = self.object:getpos() - local param2 = minetest.env:get_node(pos).param2 - for i,d in ipairs({-1, 1, -1, 1}) do - if i<3 then - pos.x = pos.x+d - else - pos.z = pos.z+d - end - - local name = minetest.env:get_node(pos).name - local par2 = minetest.env:get_node(pos).param2 - if name == "default:water_flowing" and par2 < param2 then - return pos - end - - if i<3 then - pos.x = pos.x-d - else - pos.z = pos.z-d - end - end - end - - local vec = get_flowing_dir(self) - if vec then - local v = self.object:getvelocity() - if vec and vec.x-p.x > 0 then - self.object:setvelocity({x=0.5,y=v.y,z=0}) - elseif vec and vec.x-p.x < 0 then - self.object:setvelocity({x=-0.5,y=v.y,z=0}) - elseif vec and vec.z-p.z > 0 then - self.object:setvelocity({x=0,y=v.y,z=0.5}) - elseif vec and vec.z-p.z < 0 then - self.object:setvelocity({x=0,y=v.y,z=-0.5}) - end - self.object:setacceleration({x=0, y=-10, z=0}) - self.physical_state = true - self.object:set_properties({ - physical = true - }) - return - end - end - - p.y = p.y - 0.3 - local nn = minetest.env:get_node(p).name - -- If node is not registered or node is walkably solid - if not minetest.registered_nodes[nn] or minetest.registered_nodes[nn].walkable then - if self.physical_state then - self.object:setvelocity({x=0,y=0,z=0}) - self.object:setacceleration({x=0, y=0, z=0}) - self.physical_state = false - self.object:set_properties({ - physical = false - }) - end - else - if not self.physical_state then - self.object:setvelocity({x=0,y=0,z=0}) - self.object:setacceleration({x=0, y=-10, z=0}) - self.physical_state = true - self.object:set_properties({ - physical = true - }) - end - end - end, - - on_punch = function(self, hitter) - if self.itemstring ~= '' then - hitter:get_inventory():add_item("main", self.itemstring) - end self.object:remove() - end, -}) + return + end + + local tmp = minetest.registered_nodes[name] + if tmp + and tmp.liquidtype == "flowing" then + local vec = get_flowing_dir(self.object:getpos()) + if vec then + local v = self.object:getvelocity() + if vec.x-p.x > 0 then + self.object:setvelocity({x=0.5,y=v.y,z=0}) + elseif vec.x-p.x < 0 then + self.object:setvelocity({x=-0.5,y=v.y,z=0}) + elseif vec.z-p.z > 0 then + self.object:setvelocity({x=0,y=v.y,z=0.5}) + elseif vec.z-p.z < 0 then + self.object:setvelocity({x=0,y=v.y,z=-0.5}) + end + self.object:setacceleration({x=0, y=-core.get_gravity(), z=0}) + self.physical_state = true + self.object:set_properties({ + physical = true + }) + end + end +end + +minetest.register_entity(":__builtin:item", item_entity) if minetest.setting_get("log_mods") then minetest.log("action", "builtin_item loaded") diff --git a/mods/item_drop/.gitignore b/mods/item_drop/.gitignore new file mode 100644 index 0000000..d9c069a --- /dev/null +++ b/mods/item_drop/.gitignore @@ -0,0 +1,4 @@ +## Generic ignorable patterns and files +*~ +.*.swp +debug.txt diff --git a/mods/item_drop/init.lua b/mods/item_drop/init.lua index 3aae5f5..c202961 100644 --- a/mods/item_drop/init.lua +++ b/mods/item_drop/init.lua @@ -1,99 +1,48 @@ +local timer = -1 + +local item_entity = minetest.registered_entities["__builtin:item"] +local old_on_activate = item_entity.on_activate or function()end +item_entity.on_activate = function(self, staticdata, dtime_s) + old_on_activate(self, staticdata, dtime_s) + timer = -1 +end + minetest.register_globalstep(function(dtime) + timer = timer+dtime + if timer < 0.1 then + return + end + timer = 0 for _,player in ipairs(minetest.get_connected_players()) do - if player:get_hp() > 0 and minetest.get_player_privs(player:get_player_name()).interact then + local pname = player:get_player_name() + if minetest.get_player_privs(pname).interact then local pos = player:getpos() pos.y = pos.y+0.5 local inv = player:get_inventory() - - for _,object in ipairs(minetest.env:get_objects_inside_radius(pos, 0.5)) do - if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then - if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then - inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) - if object:get_luaentity().itemstring ~= "" then + + for _,object in ipairs(minetest.get_objects_inside_radius(pos, 1)) do + if not object:is_player() + and object:get_luaentity() + and object:get_luaentity().name == "__builtin:item" then + local str = object:get_luaentity().itemstring + local item = ItemStack(str) + if inv + and inv:room_for_item("main", item) then + if str ~= "" then minetest.sound_play("item_drop_pickup", { - to_player = player:get_player_name(), + to_player = pname, }) + object:get_luaentity().itemstring = "" + inv:add_item("main", item) end - object:get_luaentity().itemstring = "" object:remove() end end end - - for _,object in ipairs(minetest.env:get_objects_inside_radius(pos, 1.5)) do - if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then - if object:get_luaentity().collect then - if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then - local pos1 = pos - pos1.y = pos1.y+0.2 - local pos2 = object:getpos() - local vec = {x=pos1.x-pos2.x, y=pos1.y-pos2.y, z=pos1.z-pos2.z} - vec.x = vec.x*3 - vec.y = vec.y*3 - vec.z = vec.z*3 - object:setvelocity(vec) - - minetest.after(1, function(args) - local lua = object:get_luaentity() - if object == nil or lua == nil or lua.itemstring == nil then - return - end - if inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then - inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) - if object:get_luaentity().itemstring ~= "" then - minetest.sound_play("item_drop_pickup", { - to_player = player:get_player_name(), - }) - end - object:get_luaentity().itemstring = "" - object:remove() - else - object:setvelocity({x=0,y=0,z=0}) - end - end, {player, object}) - - end - end - end - end end end end) -function minetest.handle_node_drops(pos, drops, digger) - for _,item in ipairs(drops) do - local count, name - if type(item) == "string" then - count = 1 - name = item - else - count = item:get_count() - name = item:get_name() - end - for i=1,count do - local obj = minetest.env:add_item(pos, name) - if obj ~= nil then - obj:get_luaentity().collect = true - local x = math.random(1, 5) - if math.random(1,2) == 1 then - x = -x - end - local z = math.random(1, 5) - if math.random(1,2) == 1 then - z = -z - end - obj:setvelocity({x=1/x, y=obj:getvelocity().y, z=1/z}) - - -- FIXME this doesnt work for deactiveted objects - if minetest.setting_get("remove_items") and tonumber(minetest.setting_get("remove_items")) then - minetest.after(tonumber(minetest.setting_get("remove_items")), function(obj) - obj:remove() - end, obj) - end - end - end - end -end if minetest.setting_get("log_mods") then minetest.log("action", "item_drop loaded") diff --git a/mods/snow/.gitignore b/mods/snow/.gitignore new file mode 100644 index 0000000..43ed67f --- /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 100644 index 0000000..89c30c8 --- /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 100644 index 0000000..02dd11e --- /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/config.lua b/mods/snow/config.lua deleted file mode 100644 index 87d25f7..0000000 --- a/mods/snow/config.lua +++ /dev/null @@ -1,10 +0,0 @@ ---This file contains configuration options for snow mod. - ---Enables falling snow. -snow.enable_snowfall = false - ---Enables debuging. -snow.debug = false - ---Enables smooth transition of biomes. -snow.smooth = true diff --git a/mods/snow/depends.txt b/mods/snow/depends.txt index 4ad96d5..9771003 100644 --- a/mods/snow/depends.txt +++ b/mods/snow/depends.txt @@ -1 +1,2 @@ default +moreblocks? \ No newline at end of file diff --git a/mods/snow/init.lua b/mods/snow/init.lua index 97f84ee..7be56dc 100644 --- a/mods/snow/init.lua +++ b/mods/snow/init.lua @@ -1,590 +1,190 @@ --[[ +--============================== +--========================================================== +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. ]]-- -snow = {} -dofile(minetest.get_modpath("snow").."/mapgen.lua") -dofile(minetest.get_modpath("snow").."/config.lua") ---Replace leaves so snow gets removed on decay. -local leaves = {} -for k,v in pairs(minetest.registered_nodes["default:leaves"]) do - leaves[k] = v + +-- 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/basic_stairs_slabs.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/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 -leaves.after_destruct = function(pos, node, digger) - pos.y = pos.y + 1 - local nodename = minetest.env:get_node(pos).name - if nodename == "snow:snow" then - minetest.env:remove_node(pos) + +--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) + 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 -end -minetest.register_node(":default:leaves", leaves) ---Pine leaves. -minetest.register_node("snow:needles", { - description = "Pine Needles", - drawtype = "allfaces_optional", - visual_scale = 1.3, - tiles = {"snow_needles.png"}, - paramtype = "light", - groups = {snappy=3, leafdecay=3, flammable=2,oddly_breakable_by_hand=2}, - drop = { - max_items = 1, - items = { - { - -- player will get xmas tree with 1/50 chance - items = {'snow:xmas_tree'}, - rarity = 50, - }, - { - -- player will get sapling with 1/20 chance - items = {'snow:sapling_pine'}, - rarity = 20, - }, - { - -- player will get leaves only if he get no saplings, - -- this is because max_items is 1 - items = {'snow:needles'}, - } - } - }, - --Remove snow above leaves after decay. - after_destruct = function(pos, node, digger) - pos.y = pos.y + 1 - local nodename = minetest.env:get_node(pos).name - if nodename == "snow:snow" then - minetest.env:remove_node(pos) - end - end, - sounds = default.node_sound_leaves_defaults(), -}) - ---Decorated Pine leaves. -minetest.register_node("snow:needles_decorated", { - description = "Decorated Pine Needles", - drawtype = "allfaces_optional", - tiles = {"snow_needles_decorated.png"}, - paramtype = "light", - groups = {snappy=3, leafdecay=3, flammable=2,oddly_breakable_by_hand=2}, - drop = { - max_items = 1, - items = { - { - -- player will get xmas tree with 1/20 chance - items = {'snow:xmas_tree'}, - rarity = 50, - }, - { - -- player will get sapling with 1/20 chance - items = {'snow:sapling_pine'}, - rarity = 20, - }, - { - -- player will get leaves only if he get no saplings, - -- this is because max_items is 1 - items = {'snow:needles_decorated'}, - } - } - }, - --Remove snow above leaves after decay. - after_destruct = function(pos, node, digger) - pos.y = pos.y + 1 - local nodename = minetest.env:get_node(pos).name - if nodename == "snow:snow" then - minetest.env:remove_node(pos) - end - end, - sounds = default.node_sound_leaves_defaults(), -}) - -minetest.register_node("snow:xmas_tree", { - description = "Christmas Tree", - drawtype = "plantlike", - visual_scale = 1.0, - tiles = {"snow_xmas_tree.png"}, - inventory_image = "snow_xmas_tree.png", - wield_image = "snow_xmas_tree.png", - paramtype = "light", - walkable = false, - groups = {snappy=2,dig_immediate=3,flammable=2}, - sounds = default.node_sound_defaults(), -}) - -minetest.register_node("snow:sapling_pine", { - 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,flammable=2}, - sounds = default.node_sound_defaults(), -}) - -minetest.register_node("snow:star", { - description = "Star", - drawtype = "torchlike", - tiles = {"snow_star.png"}, - inventory_image = "snow_star.png", - wield_image = "snow_star.png", - paramtype = "light", - walkable = false, - groups = {snappy=2,dig_immediate=3}, - sounds = default.node_sound_defaults(), -}) - -minetest.register_craft({ - type = "fuel", - recipe = "snow:needles", - burntime = 1, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "snow:sapling_pine", - burntime = 10, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "snow:needles_decorated", - burntime = 1, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "snow:xmas_tree", - burntime = 10, -}) - - - ---Snowballs -------------- -snowball_GRAVITY=9 -snowball_VELOCITY=19 - ---Shoot snowball. -local snow_shoot_snowball=function (item, player, pointed_thing) - local playerpos=player:getpos() - local obj=minetest.env:add_entity({x=playerpos.x,y=playerpos.y+1.5,z=playerpos.z}, "snow:snowball_entity") - local dir=player:get_look_dir() - obj:setvelocity({x=dir.x*snowball_VELOCITY, y=dir.y*snowball_VELOCITY, z=dir.z*snowball_VELOCITY}) - obj:setacceleration({x=dir.x*-3, y=-snowball_GRAVITY, z=dir.z*-3}) - item:take_item() - return item -end - ---The snowball Entity -snow_snowball_ENTITY={ - physical = false, - timer=0, - textures = {"snow_snowball.png"}, - lastpos={}, - collisionbox = {0,0,0,0,0,0}, -} - ---Snowball_entity.on_step()--> called when snowball is moving. -snow_snowball_ENTITY.on_step = function(self, dtime) - self.timer=self.timer+dtime - local pos = self.object:getpos() - local node = minetest.env:get_node(pos) - - --Become item when hitting a node. - if self.lastpos.x~=nil then --If there is no lastpos for some reason. - if node.name ~= "air" then - minetest.env:place_node(self.lastpos,{name="snow:snow"}) - self.object:remove() - end - end - self.lastpos={x=pos.x, y=pos.y, z=pos.z} -- Set lastpos-->Node will be added at last pos outside the node -end - -minetest.register_entity("snow:snowball_entity", snow_snowball_ENTITY) - ---Snowball. -minetest.register_craftitem("snow:snowball", { - description = "Snowball", - inventory_image = "snow_snowball.png", - on_use = snow_shoot_snowball, -}) - ---Snow. -minetest.register_node("snow:snow", { - description = "Snow", - tiles = {"snow_snow.png"}, - drawtype = "nodebox", - sunlight_propagates = true, - paramtype = "light", - param2 = nil, - --param2 is reserved for what vegetation is hiding inside. - --mapgen defines the vegetation. - --1 = Moss - groups = {crumbly=3,melts=3,oddly_breakable_by_hand=2}, - buildable_to = true, - drop = 'snow:snowball', - node_box = { - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, 0.5, -0.35, 0.5} - }, - }, - selection_box = { - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, 0.5, -0.35, 0.5} - }, - }, - sounds = default.node_sound_dirt_defaults({ - footstep = {name="default_gravel_footstep", gain=0.45}, - }), - --Update dirt node underneath snow. - after_destruct = function(pos, node, digger) - if node.param2 == 1 then - local n = minetest.env:get_node(pos).name - if n == "air" or n == "default:water_flowing" or n == "default:water_source" then - minetest.env:add_node(pos,{name="snow:moss",param2=1}) + 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 - pos.y = pos.y - 1 - local nodename = minetest.env:get_node(pos).name - if nodename == "snow:dirt_with_snow" then - minetest.env:add_node(pos,{name="default:dirt_with_grass"}) - end - end, - on_construct = function(pos, newnode) - pos.y = pos.y - 1 - local nodename = minetest.env:get_node(pos).name - if nodename == "default:dirt_with_grass" then - minetest.env:remove_node(pos) - minetest.env:add_node(pos,{name="snow:dirt_with_snow"}) - elseif nodename == "air" then - pos.y = pos.y + 1 - minetest.env:remove_node(pos) - end - end, -}) - ---Snow with dirt. -minetest.register_node("snow:dirt_with_snow", { - description = "Dirt with Snow", - tiles = {"snow_snow.png", "default_dirt.png", "default_dirt.png^snow_snow_side.png"}, - is_ground_content = true, - groups = {crumbly=3}, - drop = 'default:dirt', - sounds = default.node_sound_dirt_defaults({ - footstep = {name="default_grass_footstep", gain=0.4}, - }), - --Place snow above this node when placed. - after_place_node = function(pos, newnode) - pos.y = pos.y + 1 - local nodename = minetest.env:get_node(pos).name - if nodename == "air" then - minetest.env:add_node(pos,{name="snow:snow"}) - end - end, -}) - ---Gets rid of snow when the node underneath is dug. -local unsnowify = function(pos, node, digger) - if node.name == "default:dry_shrub" then - pos.y = pos.y - 1 - local nodename = minetest.env:get_node(pos).name - if nodename == "snow:dirt_with_snow" then - minetest.env:add_node(pos,{name="default:dirt_with_grass"}) - end - pos.y = pos.y + 1 - end - pos.y = pos.y + 1 - local nodename = minetest.env:get_node(pos).name - if nodename == "snow:snow" then - minetest.env:remove_node(pos) - local obj=minetest.env:add_entity({x=pos.x,y=pos.y,z=pos.z}, "snow:snowball_entity") - obj:setacceleration({x=0, y=-snowball_GRAVITY, z=0}) - end -end - -minetest.register_on_dignode(unsnowify) - ---Snow block. -minetest.register_node("snow:snow_block", { - description = "Snow", - tiles = {"snow_snow.png"}, - --param2 is reserved for what vegetation is hiding inside. - --mapgen defines the vegetation. - --1 = Moss - --2 = Papyrus - --3 = Dry shrub - is_ground_content = true, - groups = {crumbly=3,melts=2,falling_node=1}, - drop = 'snow:snow_block', - sounds = default.node_sound_dirt_defaults({ - footstep = {name="default_grass_footstep", gain=0.4}, - }), - --Update dirt node underneath snow. - after_destruct = function(pos, node, digger) - if node.param2 == 1 then - local n = minetest.env:get_node(pos).name - if n == "air" or n == "default:water_flowing" or n == "default:water_source" then - minetest.env:add_node(pos,{name="snow:moss",param2=1}) - end - elseif node.param2 == 2 then - local n = minetest.env:get_node(pos).name - if n == "air" or n == "default:water_flowing" or n == "default:water_source" then - minetest.env:add_node(pos,{name="default:papyrus"}) - pos.y = pos.y + 1 - local n = minetest.env:get_node(pos) - if n.name == "snow:snow_block" and n.param2 == 2 then - minetest.env:remove_node(pos) - pos.y = pos.y - 1 - minetest.env:add_node(pos,{name="snow:snow_block",param2=2}) + 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 - elseif node.param2 == 3 then - local n = minetest.env:get_node(pos).name - if n == "air" or n == "default:water_flowing" or n == "default:water_source" then - minetest.env:add_node(pos,{name="default:dry_shrub"}) + 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, -}) - ---Snow brick. -minetest.register_node("snow:snow_brick", { - description = "Snow Brick", - tiles = {"snow_snow_brick.png"}, - is_ground_content = true, - groups = {crumbly=3,melts=2}, - drop = 'snow:snow_brick', - sounds = default.node_sound_dirt_defaults({ - footstep = {name="default_grass_footstep", gain=0.4}, - }), -}) - ---Ice. -minetest.register_node("snow:ice", { - description = "Ice", - tiles = {"snow_ice.png"}, - is_ground_content = true, - groups = {snappy=2,cracky=3,melts=1}, - drop = 'snow:ice', - paramtype = "light", - sunlight_propagates = true, - sounds = default.node_sound_glass_defaults({ - footstep = {name="default_stone_footstep", gain=0.4}, - }), -}) - ---Moss. -minetest.register_node("snow:moss", { - description = "Moss", - tiles = {"snow_moss.png"}, - drawtype = "signlike", - paramtype = "light", - paramtype2 = "wallmounted", - walkable = false, - selection_box = { - type = "wallmounted", - }, - is_ground_content = true, - groups = {crumbly=3, flammable=2, attached_node=1}, -}) - -minetest.register_craft({ - output = 'snow:snow_block', - recipe = { - {'snow:snowball', 'snow:snowball'}, - {'snow:snowball', 'snow:snowball'}, - }, -}) - -minetest.register_craft({ - output = 'snow:snow_brick', - recipe = { - {'snow:snow_block', 'snow:snow_block'}, - {'snow:snow_block', 'snow:snow_block'}, - }, -}) - ---Melting ---Any node part of the group melting will melt when near warm nodes such as lava, fire, torches, etc. ---The amount of water that replaces the node is defined by the number on the group: ---1: one water_source ---2: four water_flowings ---3: one water_flowing -minetest.register_abm({ - nodenames = {"group:melts"}, - neighbors = {"group:igniter","default:torch","default:furnace_active","group:hot"}, - interval = 2, - chance = 2, - action = function(pos, node, active_object_count, active_object_count_wider) - local intensity = minetest.get_item_group(node.name,"melts") - if intensity == 1 then - minetest.env:add_node(pos,{name="default:water_source"}) - elseif intensity == 2 then - local check_place = function(pos,node) - if minetest.env:get_node(pos).name == "air" then - minetest.env:place_node(pos,node) - end - end - minetest.env:add_node(pos,{name="default:water_flowing"}) - check_place({x=pos.x+1,y=pos.y,z=pos.z},{name="default:water_flowing"}) - check_place({x=pos.x-1,y=pos.y,z=pos.z},{name="default:water_flowing"}) - check_place({x=pos.x,y=pos.y+1,z=pos.z},{name="default:water_flowing"}) - check_place({x=pos.x,y=pos.y-1,z=pos.z},{name="default:water_flowing"}) - elseif intensity == 3 then - minetest.env:add_node(pos,{name="default:water_flowing"}) - end - nodeupdate(pos) - end, -}) - ---Freezing ---Water freezes when in contact with snow. -minetest.register_abm({ - nodenames = {"default:water_source"}, - neighbors = {"snow:snow", "snow:snow_block"}, - interval = 20, - chance = 4, - action = function(pos, node, active_object_count, active_object_count_wider) - minetest.env:add_node(pos,{name="snow:ice"}) - end, -}) - ---Spread moss to cobble. -minetest.register_abm({ - nodenames = {"default:cobble"}, - neighbors = {"snow:moss"}, - interval = 20, - chance = 6, - action = function(pos, node, active_object_count, active_object_count_wider) - minetest.env:add_node(pos,{name="default:mossycobble"}) - end, -}) - ---Grow saplings -minetest.register_abm({ - nodenames = {"snow:sapling_pine"}, - interval = 10, - chance = 50, - action = function(pos, node, active_object_count, active_object_count_wider) - snow.make_pine(pos,false) - end, -}) - ---Grow saplings -minetest.register_abm({ - nodenames = {"snow:xmas_tree"}, - interval = 10, - chance = 50, - action = function(pos, node, active_object_count, active_object_count_wider) - snow.make_pine(pos,false,true) - end, -}) - -if snow.enable_snowfall then - - --Snowing - snow_fall=function (pos) - local obj=minetest.env:add_entity(pos, "snow:fall_entity") - obj:setvelocity({x=0, y=-1, z=0}) end - - -- The snowfall Entity - snow_fall_ENTITY={ - physical = true, - timer=0, - textures = {"snow_snowfall.png"}, - lastpos={}, - collisionbox = {0,0,0,0,0,0}, - } - - - -- snowfall_entity.on_step()--> called when snow is falling - snow_fall_ENTITY.on_step = function(self, dtime) - self.timer=self.timer+dtime - local pos = self.object:getpos() - local node = minetest.env:get_node(pos) - - if self.lastpos and self.object:getvelocity().y == 0 then - if minetest.env:get_node({x=self.lastpos.x,z=self.lastpos.z,y=self.lastpos.y}).name == "snow:moss" then - minetest.env:add_node({x=self.lastpos.x,z=self.lastpos.z,y=self.lastpos.y},{name="snow:snow",param2=1}) - self.object:remove() - return - end - minetest.env:place_node(self.lastpos,{name="snow:snow"}) - self.object:remove() - end - - if self.timer > 120 then - self.object:remove() - end - - self.lastpos={x=pos.x, y=pos.y, z=pos.z} -- Set lastpos-->Node will be added at last pos outside the node - end - - minetest.register_entity("snow:fall_entity", snow_fall_ENTITY) - - --Regenerate Snow - minetest.register_abm({ - nodenames = {"default:dirt_with_grass", "default:desert_sand", "snow:moss"}, - interval = 50, - chance = 150, - action = function(pos, node, active_object_count, active_object_count_wider) - --Check we are in the right biome - local env = minetest.env - local perlin1 = env:get_perlin(112,3, 0.5, 150) - local test = perlin1:get2d({x=pos.x, y=pos.z}) - local in_biome = false - local smooth = snow.smooth - if smooth and (test > 0.73 or (test > 0.43 and math.random(0,29) > (0.73 - test) * 100 )) then - in_biome = true - elseif not smooth and test > 0.53 then - in_biome = true - end - if in_biome then - --Check if block is under cover - local ground_y = nil - for y=15,0,-1 do - if env:get_node({x=pos.x,y=y+pos.y,z=pos.z}).name ~= "air" then - ground_y = pos.y+y - break - end - end - if ground_y then - local n = env:get_node({x=pos.x,y=ground_y,z=pos.z}) - if (n.name ~= "snow:snow" and n.name ~= "snow:snow_block" and n.name ~= "snow:ice" and n.name ~= "default:water_source" and n.name ~= "default:papyrus") then - local obj = minetest.env:get_objects_inside_radius({x=pos.x,y=ground_y+20,z=pos.z}, 15) - for i,v in pairs(obj) do - e = v:get_luaentity() - if e ~= nil and e.name == "snow:fall_entity" then - return - end - end - snow_fall({x=pos.x,y=ground_y+15,z=pos.z}) - if snow.debug then - print("snowfall at x"..pos.x.." y"..pos.z) - end - end - 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/mapgen.lua b/mods/snow/mapgen.lua deleted file mode 100644 index cd4cb69..0000000 --- a/mods/snow/mapgen.lua +++ /dev/null @@ -1,304 +0,0 @@ ---Makes pine tree -function snow.make_pine(pos,snow,xmas) - local env = minetest.env - local perlin1 = env:get_perlin(112,3, 0.5, 150) - local try_node = function(pos, node) - local n = env:get_node(pos).name - if n == "air" or n == "snow:needles" or n == "default:leaves" or n == "snow:sapling_pine" or n == "snow:snow" or "snow:needles_decorated" then - env:add_node(pos,node) - end - end - local leaves = "snow:needles" - if xmas then leaves = "snow:needles_decorated" end - --Clear ground. - for x=-1,1 do - for z=-1,1 do - if env:get_node({x=pos.x+x,y=pos.y,z=pos.z+z}).name == "snow:snow" then - env:remove_node({x=pos.x+x,y=pos.y,z=pos.z+z}) - end - if env:get_node({x=pos.x+x,y=pos.y,z=pos.z+z}).name == "snow:snow_block" then - env:remove_node({x=pos.x+x,y=pos.y,z=pos.z+z}) - end - end - end - --Make tree. - for i=0, 4 do - local env = minetest.env - if i==1 or i==2 then - for x=-1,1 do - for z=-1,1 do - local x = pos.x + x - local z = pos.z + z - try_node({x=x,y=pos.y+i,z=z},{name=leaves}) - if snow and x ~= 0 and z ~= 0 and perlin1:get2d({x=x,y=z}) > 0.53 then - try_node({x=x,y=pos.y+i+1,z=z},{name="snow:snow"}) - end - end - end - end - if i==3 or i==4 then - local x = pos.x - local y = pos.y+i - local z = pos.z - try_node({x=x+1,y=y,z=z},{name=leaves}) - try_node({x=x-1,y=y,z=z},{name=leaves}) - try_node({x=x,y=y,z=z+1},{name=leaves}) - try_node({x=x,y=y,z=z-1},{name=leaves}) - if snow then - if perlin1:get2d({x=x+1,y=z}) > 0.53 then - try_node({x=x+1,y=y+1,z=z},{name="snow:snow"}) - end - if perlin1:get2d({x=x+1,y=z}) > 0.53 then - try_node({x=x-1,y=y+1,z=z},{name="snow:snow"}) - end - if perlin1:get2d({x=x,y=z+1}) > 0.53 then - try_node({x=x,y=y+1,z=z+1},{name="snow:snow"}) - end - if perlin1:get2d({x=x,y=z-1}) > 0.53 then - try_node({x=x,y=y+1,z=z-1},{name="snow:snow"}) - end - end - end - try_node({x=pos.x,y=pos.y+i,z=pos.z},{name="default:tree"}) - end - try_node({x=pos.x,y=pos.y+5,z=pos.z},{name=leaves}) - try_node({x=pos.x,y=pos.y+6,z=pos.z},{name=leaves}) - if xmas then - try_node({x=pos.x,y=pos.y+7,z=pos.z},{name="snow:star"}) - 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="snow:snow"}) - end -end - - - ---Snow biomes are found at 0.53 and greater perlin noise. -minetest.register_on_generated(function(minp, maxp, seed) -if maxp.y >= -10 then - local debug = snow.debug - - --Should make things a bit faster. - local env = minetest.env - - --Get map specific perlin - local perlin1 = env:get_perlin(112,3, 0.5, 150) - - -- Assume X and Z lengths are equal - local divlen = 16 - local divs = (maxp.x-minp.x); - local x0 = minp.x - local z0 = minp.z - local x1 = maxp.x - local z1 = maxp.z - - --Speed hack: checks the corners and middle of the chunk for "snow biome". - if not ( perlin1:get2d( {x=x0, y=z0} ) > 0.53 ) --top left - and not ( perlin1:get2d( { x = x0 + ( (x1-x0)/2), y=z0 } ) > 0.53 )--top middle - and not (perlin1:get2d({x=x1, y=z1}) > 0.53) --bottom right - and not (perlin1:get2d({x=x1, y=z0+((z1-z0)/2)}) > 0.53) --right middle - and not (perlin1:get2d({x=x0, y=z1}) > 0.53) --bottom left - and not (perlin1:get2d({x=x1, y=z0}) > 0.53) --top right - and not (perlin1:get2d({x=x0+((x1-x0)/2), y=z1}) > 0.53) --left middle - and not (perlin1:get2d({x=(x1-x0)/2, y=(z1-z0)/2}) > 0.53) --middle - and not (perlin1:get2d({x=x0, y=z1+((z1-z0)/2)}) > 0.53) then --bottom middle - return - end - - --Choose a biome types. - local pr = PseudoRandom(seed+57) - local biome - - --Land biomes - biome = pr:next(1, 5) - local snowy = biome == 1 --spawns alot of snow - local plain = biome == 2 --spawns not much - local alpine = biome == 3 --rocky terrain - -- biome == 4 or biome == 5 -- normal biome - - --Water biomes - biome2 = pr:next(1, 5) - local cool = biome == 1 --only spawns ice on edge of water - local icebergs = biome == 2 - local icesheet = biome == 3 - local icecave = biome == 4 - local icehole = biome == 5 --icesheet with holes - - --Misc biome settings. - local icy = pr:next(1, 2) == 2 --If enabled spawns ice in sand instead of snow blocks. - local mossy = pr:next(1,2) == 1 --Spawns moss in snow. - local shrubs = pr:next(1,2) == 1 --Spawns dry shrubs in snow. - local pines = pr:next(1,2) == 1 --spawns pines. - - --Debugging function - local biomeToString = function(num,num2) - local biome, biome2 - if num == 1 then biome = "snowy" - elseif num == 2 then biome = "plain" - elseif num == 3 then biome = "alpine" - elseif num == 4 or num == 5 then biome = "normal" - else biome = "unknown "..num end - - if num2 == 1 then biome2 = "cool" - elseif num2 == 2 then biome2 = "icebergs" - elseif num2 == 3 then biome2 = "icesheet" - elseif num2 == 4 then biome2 = "icecave" - elseif num2 == 5 then biome2 = "icehole" - else biome2 = "unknown "..num end - - return biome, biome2 - end - - local make_pine = snow.make_pine - local smooth = snow.smooth - - --Reseed random. - pr = PseudoRandom(seed+68) - - if alpine then - local trees = env:find_nodes_in_area(minp, maxp, {"default:leaves","default:tree"}) - for i,v in pairs(trees) do - env:remove_node(v) - end - end - - --Loop through chunk. - for j=0,divs do - for i=0,divs do - - local x = x0+i - local z = z0+j - - --Check if we are in a "Snow biome" - local in_biome = false - local test = perlin1:get2d({x=x, y=z}) - if smooth and (not snowy) and (test > 0.73 or (test > 0.43 and pr:next(0,29) > (0.73 - test) * 100 )) then - in_biome = true - elseif (not smooth or snowy) and test > 0.53 then - in_biome = true - end - - if in_biome then - - if not plain or pr:next(1,12) == 1 then - - -- Find ground level (0...15) - local ground_y = nil - for y=maxp.y,minp.y+1,-1 do - if env:get_node({x=x,y=y,z=z}).name ~= "air" then - ground_y = y - break - end - end - - -- Snowy biome stuff - local node = env:get_node({x=x,y=ground_y,z=z}) - - if ground_y and (node.name == "default:dirt_with_grass" or node.name == "default:junglegrass") then - local veg - if mossy and pr:next(1,10) == 1 then veg = 1 end - if alpine then - --Gets rid of dirt - env:add_node({x=x,y=ground_y+1,z=z}, {name="snow:snow",param2=veg}) - for y=ground_y,-6,-1 do - if env:get_node({x=x,y=y,z=z}) and env:get_node({x=x,y=y,z=z}).name == "default:stone" then - break - else - env:add_node({x=x,y=y,z=z},{name="default:stone"}) - end - end - elseif (shrubs and pr:next(1,28) == 1) or node.name == "default:junglegrass" then - --Spawns dry shrubs. - env:add_node({x=x,y=ground_y,z=z}, {name="snow:dirt_with_snow"}) - if snowy then - env:add_node({x=x,y=ground_y+1,z=z}, {name="snow:snow_block", param2=3}) - else - env:add_node({x=x,y=ground_y+1,z=z}, {name="default:dry_shrub"}) - end - elseif pines and pr:next(1,36) == 1 then - --Spawns pines. - env:add_node({x=x,y=ground_y,z=z}, {name="default:dirt_with_grass"}) - make_pine({x=x,y=ground_y+1,z=z},true) - elseif snowy then - --Spawns snow blocks. - env:add_node({x=x,y=ground_y+1,z=z}, {name="snow:snow_block"}) - env:add_node({x=x,y=ground_y+2,z=z}, {name="snow:snow",param2=veg}) - else - --Spawns snow. - env:add_node({x=x,y=ground_y,z=z}, {name="snow:dirt_with_snow"}) - env:add_node({x=x,y=ground_y+1,z=z}, {name="snow:snow",param2=veg}) - end - elseif ground_y and node.name == "default:sand" then - --Spawns ice in sand if icy, otherwise spawns snow on top. - if not icy then - env:add_node({x=x,y=ground_y+1,z=z}, {name="snow:snow"}) - env:add_node({x=x,y=ground_y,z=z}, {name="snow:snow_block"}) - else - env:add_node({x=x,y=ground_y,z=z}, {name="snow:ice"}) - end - elseif ground_y and env:get_node({x=x,y=ground_y,z=z}).name == "default:leaves" then - env:add_node({x=x,y=ground_y+1,z=z}, {name="snow:snow"}) - elseif ground_y and env:get_node({x=x,y=ground_y,z=z}).name == "default:papyrus" then - for i=ground_y, ground_y-4, -1 do - if env:get_node({x=x,y=i,z=z}).name == "default:papyrus" then - env:add_node({x=x,y=ground_y+1,z=z}, {name="snow:snow"}) - env:add_node({x=x,y=i,z=z}, {name="snow:snow_block", param2=2}) - end - end - elseif ground_y and node.name == "default:water_source" then - if not icesheet and not icecave and not icehole then - --Coastal ice. - local x1 = env:get_node({x=x+1,y=ground_y,z=z}).name - local z1 = env:get_node({x=x,y=ground_y,z=z+1}).name - local xz1 = env:get_node({x=x+1,y=ground_y,z=z+1}).name - local xz2 = env:get_node({x=x-1,y=ground_y,z=z-1}).name - local x2 = env:get_node({x=x-1,y=ground_y,z=z}).name - local z2 = env:get_node({x=x,y=ground_y,z=z-1}).name - local y = env:get_node({x=x,y=ground_y-1,z=z}).name - local rand = pr:next(1,4) == 1 - if - ((x1 and x1 ~= "default:water_source" and x1 ~= "snow:ice" and x1 ~= "air" and x1 ~= "ignore") or ((cool or icebergs) and x1 == "snow:ice" and rand)) or - ((z1 and z1 ~= "default:water_source" and z1 ~= "snow:ice" and z1 ~= "air" and z1 ~= "ignore") or ((cool or icebergs) and z1 == "snow:ice" and rand)) or - ((xz1 and xz1 ~= "default:water_source" and xz1 ~= "snow:ice" and xz1 ~= "air"and xz1 ~= "ignore") or ((cool or icebergs) and xz1 == "snow:ice" and rand)) or - ((xz2 and xz2 ~= "default:water_source" and xz2 ~= "snow:ice" and xz2 ~= "air"and xz2 ~= "ignore") or ((cool or icebergs) and xz2 == "snow:ice" and rand)) or - ((x2 and x2 ~= "default:water_source" and x2 ~= "snow:ice" and x2 ~= "air" and x2 ~= "ignore") or ((cool or icebergs) and x2 == "snow:ice" and rand)) or - ((z2 and z2 ~= "default:water_source" and z2 ~= "snow:ice" and z2 ~= "air" and z2 ~= "ignore") or ((cool or icebergs) and z2 == "snow:ice" and rand)) or - (y ~= "default:water_source" and y ~= "snow:ice" and y ~= "air") or (pr:next(1,6) == 1 and icebergs) then - env:add_node({x=x,y=ground_y,z=z}, {name="snow:ice"}) - end - else - --Icesheets, Broken icesheet, Icecaves - if (icehole and pr:next(1,10) > 1) or icecave or icesheet then - env:add_node({x=x,y=ground_y,z=z}, {name="snow:ice"}) - end - if icecave then - --Gets rid of water underneath ice - for y=ground_y-1,-60,-1 do - if env:get_node({x=x,y=y,z=z}) and env:get_node({x=x,y=y,z=z}).name ~= "default:water_source" then - break - else - env:remove_node({x=x,y=y,z=z}) - end - end - end - end - --~ elseif ground_y and node.name == "snow:snow" and node.name ~= "snow:ice" then - --~ --Abort genaration. - --~ local name = env:get_node({x=x,y=ground_y-1,z=z}).name - --~ if name ~= "default:leaves" and name ~= "snow:needles" then - --~ if debug then - --~ print(biomeToString(biome)..": snow found ABORTED!") - --~ end - --~ return - --~ end - end - end - end - end - end - if debug then - biome_string,biome2_string = biomeToString(biome,biome2) - print(biome_string.." and "..biome2_string..": Snow Biome Genarated near x"..minp.x.." z"..minp.z) - end -end -end -) diff --git a/mods/snow/models/sled.blend b/mods/snow/models/sled.blend new file mode 100644 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 100644 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 100644 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 100644 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 100644 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 100644 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 100644 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 100644 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 xMOpcC05GqUnApz1IJ}%HqDv^uO2t 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 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 100644 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 100644 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 100644 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 100644 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 100644 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 100644 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 100644 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 100644 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 index f2bb954..13013b4 100644 --- a/mods/snow/readme.txt +++ b/mods/snow/readme.txt @@ -4,18 +4,49 @@ \___ \| '_ \ / _ \ \ /\ / / | |\/| |/ _ \ / _` | ____) | | | | (_) \ V V / | | | | (_) | (_| | |_____/|_| |_|\___/ \_/\_/ |_| |_|\___/ \__,_| - -By Splizard, bob and cornernote. + + 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 slow map loading while a snow biome is generated. +While this mod is installed you may experience slower map loading while a snow biome is generated. USAGE: ------- @@ -32,58 +63,41 @@ There are nine biome types: * Snowy * Plain -Snow can be picked up and thrown as snowballs or crafted into snow blocks. +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 Block: - -Snowball Snowball -Snowball Snowball - 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. - -CHANGELOG: ------------- -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/schematics/pine.mts b/mods/snow/schematics/pine.mts new file mode 100644 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, active_object_count, active_object_count_wider) + + -- '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 100644 index 0000000..3cee7b1 --- /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 100644 index 0000000..a65872d --- /dev/null +++ b/mods/snow/src/basic_stairs_slabs.lua @@ -0,0 +1,326 @@ +-- 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 + + + + + +snow_stairs = {} -- This is a little trick. Without it Minetest will complain + -- "attempt to index global 'snow' (a nil value)" and + -- refuse to load. So a value without definition "={}"is assigned to snow. + +-- Node will be called snow:stair_ +function snow_stairs.register_stair(subname, recipeitem, groups, images, description, sounds) + minetest.register_node("snow:stair_" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = true, + groups = groups, + 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 + if minetest.get_node(pos).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 minetest.get_node(pos).name == "default:dirt" then + minetest.set_node(pos, {name="default:dirt_with_snow"}) + end + end + }) +--[[ + -- for replace ABM + minetest.register_node("snow:stair_" .. subname.."upside_down", { + replace_name = "snow:stair_" .. subname, + groups = {slabs_replace=1}, + }) +--]] + minetest.register_craft({ + output = 'snow:stair_' .. subname .. ' 6', + recipe = { + {recipeitem, "", ""}, + {recipeitem, recipeitem, ""}, + {recipeitem, recipeitem, recipeitem}, + }, + }) + + -- Flipped recipe + minetest.register_craft({ + output = 'snow:stair_' .. subname .. ' 6', + recipe = { + {"", "", recipeitem}, + {"", recipeitem, recipeitem}, + {recipeitem, recipeitem, recipeitem}, + }, + }) +end + +-- Node will be called snow:slab_ +function snow_stairs.register_slab(subname, recipeitem, groups, images, description, sounds) + minetest.register_node("snow:slab_" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = true, + groups = groups, + 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}, + }, + 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, + + on_construct = function(pos) + pos.y = pos.y - 1 + if minetest.get_node(pos).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 minetest.get_node(pos).name == "default:dirt" then + minetest.set_node(pos, {name="default:dirt_with_snow"}) + end + end + + }) +--[[ + -- for replace ABM + minetest.register_node("snow:slab_" .. subname.."upside_down", { + replace_name = "snow:slab_"..subname, + groups = {slabs_replace=1}, + }) +--]] + + minetest.register_craft({ + output = 'snow:slab_' .. subname .. ' 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}_ +function snow_stairs.register_stair_and_slab(subname, recipeitem, groups, images, desc_stair, desc_slab, freezemelt, liquidtype, paramtype, sunlight_propagates) + snow_stairs.register_stair(subname, recipeitem, groups, images, desc_stair, freezemelt, liquidtype, paramtype, sunlight_propagates) + snow_stairs.register_slab(subname, recipeitem, groups, images, desc_slab, freezemelt, liquidtype, paramtype, sunlight_propagates) +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", "default_ice.png", "Ice Stairs", "Ice Slabs"}, + {"snowblock", "default:snowblock", "default_snow.png", "Snowblock Stairs", "Snowblock Slabs"}, + {"snow_cobble", "snow:snow_cobble", "snow_snow_cobble.png", "Snow Cobble Stairs", "Snow Cobble Slabs"}, + {"snow_brick", "snow:snow_brick", "snow_snow_brick.png", "Snow Brick Stair", "Snow Brick Slab"}, +} + +for _, row in ipairs(list_of_snow_stuff) do + local snow_subname = row[1] + local snow_recipeitem = row[2] + local snow_images = row[3] + local snow_desc_stair = row[4] + local snow_desc_slab = row[5] + + + + + snow_stairs.register_stair_and_slab(snow_subname, snow_recipeitem, + {cracky=2, crumbly=2, choppy=2, oddly_breakable_by_hand=2, melts=1, icemaker=1}, + {snow_images}, + snow_desc_stair, + snow_desc_slab, + "default:water_source", + "none", + "light", + true + ) + +end -- End the "list of snow stuff" part of the above section. ~ LazyJ + + +-- Snow stairs and slabs should be easier to break than the more dense and +-- manufactured, other snow-type nodes in the list above. ~ lazyJ +minetest.override_item("snow:stair_snowblock", { + groups = {cracky=3, crumbly=3, choppy=3, oddly_breakable_by_hand=3, melts=2, icemaker=1}, +}) + +minetest.override_item("snow:slab_snowblock", { + groups = {cracky=3, crumbly=3, choppy=3, oddly_breakable_by_hand=3, melts=2, icemaker=1}, +}) + + + +-- Everything above is made of snow and uses snow sounds, ice, however, should sound more like glass +-- and be harder to dig. ~ LazyJ +minetest.override_item("snow:stair_ice", { + groups = {cracky=1, crumbly=1, choppy=1, oddly_breakable_by_hand=1, melts=2, icemaker=1}, + use_texture_alpha = true, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.override_item("snow:slab_ice", { + groups = {cracky=1, crumbly=1, choppy=1, oddly_breakable_by_hand=1, melts=2, icemaker=1}, + use_texture_alpha = true, + sounds = default.node_sound_glass_defaults(), +}) diff --git a/mods/snow/src/crafting.lua b/mods/snow/src/crafting.lua new file mode 100644 index 0000000..fcc1706 --- /dev/null +++ b/mods/snow/src/crafting.lua @@ -0,0 +1,234 @@ +--[[ + +Crafting Sections (in order, top to bottom): + 1. Fuel + 2. Cooking + 3. Crafting and Recycling + +The crafting recipe for the sled is in the sled.lua file. + +~ LazyJ + +--]] + +-- 1. Fuel + +minetest.register_craft({ + type = "fuel", + recipe = "snow:needles", + burntime = 1, +}) + + + +minetest.register_craft({ + type = "fuel", + recipe = "snow:sapling_pine", + burntime = 10, +}) + + + +minetest.register_craft({ + type = "fuel", + recipe = "snow:needles_decorated", + burntime = 1, +}) + + + +minetest.register_craft({ + type = "fuel", + recipe = "snow:xmas_tree", + burntime = 10, +}) + + + +-- 2. 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", +}) + + + + + + +-- 3. 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'} + } +}) + +--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' + } +}) + + +-- Why not recycle snow_bricks back into snowblocks? ~ LazyJ +minetest.register_craft({ + output = 'default:snowblock 4', + recipe = { + {'snow:snow_brick'} + } +}) + + + +-- 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 100644 index 0000000..1e40257 --- /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 100644 index 0000000..455c92d --- /dev/null +++ b/mods/snow/src/mapgen.lua @@ -0,0 +1,181 @@ +--[[ +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 + --Clear ground. + for z = -1,1 do + for x = -1,1 do + local p = {x=pos.x+x,y=pos.y,z=pos.z+z} + local nd = minetest.get_node(p).name + if nd == "default:snow" + or nd == "default:snowblock" then + minetest.remove_node(p) + end + 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 + + --Clear ground. + local node = a:index(x,pos.y,z) + if data[node] == c_snow then + data[node] = c_air + end + + --Make tree. + for i = 1,2 do + local node = a:index(x,pos.y+i,z) + data[node] = c_pine_needles + if snow + and 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 snow then + 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 + 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 snow + and 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 100644 index 0000000..0bb01fe --- /dev/null +++ b/mods/snow/src/mapgen_v6.lua @@ -0,0 +1,351 @@ +-- 2D noise for coldness + +local np_cold = { + offset = 0, + scale = 1, + spread = {x=150, y=150, z=150}, + 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 ws_lists = {} +local function get_ws_list(a,x) + ws_lists[a] = ws_lists[a] or {} + local v = ws_lists[a][x] + if v then + return v + end + v = {} + for x=x,x + (80 - 1) do + local y = do_ws_func(a, x) + v[x] = y + end + ws_lists[a][x] = v + return v +end + +-- On generated function + +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 spawn_pine = snow.voxelmanip_pine + local smooth = snow.smooth_biomes + + local c_dirt_with_grass = minetest.get_content_id("default:dirt_with_grass") + local c_dirt = minetest.get_content_id("default:dirt") + local c_tree = minetest.get_content_id("default:tree") + local c_apple = minetest.get_content_id("default:apple") + local c_snow = minetest.get_content_id("default:snow") + local c_snow_block = minetest.get_content_id("default:snowblock") + local c_dirt_with_snow = minetest.get_content_id("default:dirt_with_snow") + local c_air = minetest.get_content_id("air") + local c_ignore = minetest.get_content_id("ignore") + local c_stone = minetest.get_content_id("default:stone") + local c_dry_shrub = minetest.get_content_id("default:dry_shrub") + local c_leaves = minetest.get_content_id("default:leaves") + local c_jungleleaves = minetest.get_content_id("default:jungleleaves") + local c_junglegrass = minetest.get_content_id("default:junglegrass") + local c_ice = minetest.get_content_id("default:ice") + local c_water = minetest.get_content_id("default:water_source") + local c_papyrus = minetest.get_content_id("default:papyrus") + local c_sand = minetest.get_content_id("default:sand") + + local vm = minetest.get_voxel_manip() + local emin, emax = vm:read_from_map(minp, maxp) + local area = VoxelArea:new({MinEdge=emin, MaxEdge=emax}) + local data = vm:get_data() + + local snow_tab,num = {},1 + + local sidelen = x1 - x0 + 1 + local chulens = {x=sidelen, y=sidelen, z=sidelen} + local nvals_cold = minetest.get_perlin_map(np_cold, chulens):get2dMap_flat({x=x0, y=z0}) + local nvals_ice = minetest.get_perlin_map(np_ice, chulens):get2dMap_flat({x=x0, y=z0}) + + -- Choose biomes + local pr = PseudoRandom(seed+57) + -- Land biomes + local biome = pr:next(1, 5) + local snowy = biome == 1 -- spawns alot of 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 = nvals_cold[ni] + if smooth and (not snowy) + and (test > 0.73 or (test > 0.43 and pr:next(0,29) > (0.73 - test) * 100 )) then + in_biome = true + elseif (not smooth or snowy) and test > 0.53 then + in_biome = true + end + + if not in_biome then + if alpine and test > 0.43 then + 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 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 + elseif in_biome then + write_to_map = true + 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 = 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 then + local node = area:index(x, ground_y, z) + local abovenode = area:index(x, ground_y+1, z) + local belownode = area:index(x, ground_y-1, z) + + if ground_y and data[node] == c_dirt_with_grass then + if alpine and test > 0.53 then + snow_tab[num] = {abovenode, z, x, test} + num = num+1 + for y = ground_y, -6, -1 do + local vi = area:index(x, y, z) + if data[vi] == c_stone then + break + else + data[vi] = c_stone + end + end + elseif (shrubs and pr:next(1,28) == 1) then + data[node] = c_dirt_with_snow + data[abovenode] = c_dry_shrub + elseif pines and pr:next(1,36) == 1 then + data[node] = c_dirt_with_snow + spawn_pine({x=x, y=ground_y+1, z=z}, area, data) + elseif snowy and test > 0.63 then + data[abovenode] = c_snow_block + else + data[node] = c_dirt_with_snow + snow_tab[num] = {abovenode, z, x, test} + num = num+1 + end + elseif ground_y and data[node] == c_sand then + if not icy then + snow_tab[num] = {abovenode, z, x, test} + num = num+1 + else + data[node] = c_ice + end + elseif ground_y and data[node] == c_leaves + or data[node] == c_jungleleaves or data[node] == c_apple then + if alpine then + snow_tab[num] = {abovenode, z, x, test} + num = num+1 + for y = ground_y, -6, -1 do + local stone = area:index(x, y, z) + if data[stone] == c_stone then + break + else + data[stone] = c_stone + end + end + else + snow_tab[num] = {abovenode, z, x, test} + num = num+1 + end + elseif ground_y + and data[node] == c_junglegrass then + data[node] = c_dry_shrub + elseif ground_y + and data[node] == c_papyrus then + for y = ground_y, ground_y-4, -1 do + local vi = area:index(x, y, z) + if data[vi] == c_papyrus then + snow_tab[num] = {area:index(x, ground_y, z), z, x, test} + num = num+1 + data[vi] = c_snow_block + end + end + elseif ground_y + and data[node] == c_water then + if not icesheet + and not icecave + and not icehole then + local x1 = data[area:index(x+1, ground_y, z)] + local z1 = data[area:index(x, ground_y, z+1)] + local xz1 = data[area:index(x+1, ground_y, z+1)] + local xz2 = data[area:index(x-1, ground_y, z-1)] + local x2 = data[area:index(x-1, ground_y, z)] + local z2 = data[area:index(x, ground_y, z-1)] + local rand = (pr:next(1,4) == 1) and (cool or icebergs) + local ice + if rand then + for _,i in ipairs({x1,z1,xz1,xz2,x2,z2}) do + if i == c_ice then + ice = true + break + end + end + end + if not ice then + for _,i in ipairs({x1,z1,xz1,xz2,x2,z2}) 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 (icehole and pr:next(1,10) > 1) + or icecave + or icesheet 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 + else + data[vi] = c_air + end + end + end + end + end + end + end + ni = ni + 1 + end + end + + local param2s + if num ~= 1 then + local wsz, wsx + for _,i in pairs(snow_tab) do + local p,z,x,test = unpack(i) + data[p] = c_snow + test = test-0.73 + if test > 0 then + local minh = math.floor(test*4*9)%9+1 + if minh ~= 1 then + if not wsz then + wsz = get_ws_list(5, z0) + wsx = get_ws_list(2, x0) + param2s = vm:get_param2_data() + end + local h = math.min(minh, math.floor(wsx[x]+wsz[z]*5)%9+1) + if h ~= 1 then + if h == 9 then + h = 4 + end + param2s[p] = h*7 + end + end + end + end + end + + vm:set_data(data) + if param2s then + vm:set_param2_data(param2s) + end + 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 100644 index 0000000..ebb3eed --- /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 100644 index 0000000..c2582bd --- /dev/null +++ b/mods/snow/src/nodes.lua @@ -0,0 +1,351 @@ +-- NODES + +-- Pine Needles +minetest.register_node("snow:needles",{ + description = "Pine Needles", + drawtype = "allfaces_optional", + visual_scale = 1.3, + tiles = {"snow_needles.png"}, + waving = 1, + paramtype = "light", + groups = {snappy=3, leafdecay=5}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = {'snow:sapling_pine'}, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + 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 + --Christmas trees + + minetest.override_item("snow:needles", { + drop = { + max_items = 1, + items = { + { + -- player will get xmas tree with 1/120 chance + items = {'snow:xmas_tree'}, + rarity = 120, + }, + { + -- player will get sapling with 1/20 chance + items = {'snow:sapling_pine'}, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'snow:needles'}, + } + } + } + }) +end + + + --Christmas easter egg + minetest.register_on_mapgen_init( function() + if rawget(_G, "skins") then + skins.add("character_snow_man") + end + end + ) + + + +--[[ +Original, static Xmas lights. Keep so people can "turn off" the +animation if it is too much for them. ~ LazyJ + +--Decorated Pine leaves +minetest.register_node("snow:needles_decorated", { + description = "Decorated Pine Needles", + drawtype = "allfaces_optional", + tiles = {"snow_needles_decorated.png"}, + paramtype = "light", + groups = {snappy=3, leafdecay=3}, + drop = { + max_items = 1, + items = { + { + -- player will get xmas tree with 1/20 chance + items = {'snow:xmas_tree'}, + rarity = 50, + }, + { + -- player will get sapling with 1/20 chance + items = {'snow:sapling_pine'}, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'snow:needles_decorated'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), +}) +--]] + + + +-- Animated, "blinking lights" version. ~ LazyJ + +-- Decorated Pine Leaves +minetest.register_node("snow:needles_decorated", { + description = "Decorated Pine Needles", + drawtype = "allfaces_optional", + light_source = 5, + inventory_image = minetest.inventorycube("snow_needles_decorated.png"), + --tiles = {"snow_needles_decorated.png"}, + tiles = { + {name="snow_needles_decorated_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=20.0}} + }, + paramtype = "light", + groups = {snappy=3, leafdecay=5}, + drop = { + max_items = 1, + items = { + { + -- player will get xmas tree with 1/120 chance + items = {'snow:xmas_tree'}, + rarity = 120, + }, + { + -- player will get sapling with 1/20 chance + items = {'snow:sapling_pine'}, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'snow:needles_decorated'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), +}) + + + + +-- Xmas Tree Sapling +minetest.register_node("snow:xmas_tree", { + description = "Christmas Tree", + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"snow_xmas_tree.png"}, + inventory_image = "snow_xmas_tree.png", + wield_image = "snow_xmas_tree.png", + paramtype = "light", + walkable = false, + groups = {snappy=2,dig_immediate=3}, + sounds = default.node_sound_defaults(), +}) + + + +-- Pine Sapling +minetest.register_node("snow:sapling_pine", { + 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}, + sounds = default.node_sound_defaults(), + +}) + + + +-- Star on Xmas Trees +minetest.register_node("snow:star", { + description = "Star", + --drawtype = "torchlike", + drawtype = "plantlike", -- Stars disappeared when viewed at the right angle. "Plantlike" solved the visual problem. ~ LazyJ + tiles = {"snow_star.png"}, + inventory_image = "snow_star.png", + wield_image = "snow_star.png", + paramtype = "light", + walkable = false, + --groups = {snappy=2,dig_immediate=3}, + groups = {cracky=1, crumbly=1, choppy=1, oddly_breakable_by_hand=1}, -- Don't want the ornament breaking too easily because you have to punch it to turn it on and off. ~ LazyJ + sounds = default.node_sound_glass_defaults({dig = {name="default_glass_footstep", gain=0.2}}), -- Breaking "glass" sound makes it sound like a real, broken, Xmas tree ornament (Sorry, Mom!). ;)- ~ LazyJ + 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 (Lit Version) on Xmas Trees +minetest.register_node("snow:star_lit", { + description = "Star Lighted", + drawtype = "plantlike", + light_source = LIGHT_MAX, + tiles = {"snow_star_lit.png"}, + wield_image = "snow_star.png", + paramtype = "light", + walkable = false, + drop = "snow:star", + groups = {cracky=1, crumbly=1, choppy=1, oddly_breakable_by_hand=1, not_in_creative_inventory=1}, + sounds = default.node_sound_glass_defaults({dig = {name="default_glass_footstep", gain=0.2}}), + on_punch = function(pos, node) + node.name = "snow:star" + minetest.set_node(pos, node) + nodeupdate(pos) + end, +}) + + + +-- 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}, +}) + + + +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 + + + +-- Snow Brick +minetest.register_node("snow:snow_brick", { + description = "Snow Brick", + tiles = {"snow_snow_brick.png"}, + is_ground_content = true, + freezemelt = "default:water_source", + 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 Cobble ~ LazyJ +-- Described as Icy Snow +minetest.register_node("snow:snow_cobble", { + description = "Icy Snow", + tiles = {"snow_snow_cobble.png"}, + is_ground_content = true, + liquidtype = "none", + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + -- 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}, + 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 +}) + + + +-- 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 100644 index 0000000..f8358c3 --- /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 + player: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 100644 index 0000000..d0be241 --- /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 100644 index 0000000..58f6c62 --- /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 = 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 100644 index 0000000..f2dd9f9 --- /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 100644 index 0000000000000000000000000000000000000000..9b72766f4c8f64ec7d556f9317ee3d67f92e62c5 GIT binary patch literal 1630 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

@zGx@CykZio(LrIz>pF5GvlRCu!jOI!{Y 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 P015yANkvXXu0mjfV%lo= diff --git a/mods/snow/textures/snow_needles.png b/mods/snow/textures/snow_needles.png index b8140575bf6a587ec533161d2880558b3ffe497d..2a242d030f056de51b29cbbcece0c9fd39bcda29 100644 GIT binary patch delta 636 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 diff --git a/mods/snow/textures/snow_needles_decorated_animated.png b/mods/snow/textures/snow_needles_decorated_animated.png new file mode 100644 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_?&YT%i9 zrEqW7nN-V?IAf5bfwqQ3g3J_=`BRR8T?*4$lWI&}qQi0qQiK<&d)q80fhdL0+s`iB!32COGiWiK>#uUCTTK$g#Z8m32;bRa{vGf6951U69E94oEQKA z00(qQO+^RX2O0wv2p@#aU;qFCBS}O-R5;76QcF+5U=W?pwiS- z1PrDo`JL`m#H_JG1iv|9>8bYoG6$$ylE0hXe(- zeFp&0_8p>}=g*l01)^fmcS>`cITtT{RREd zB3zwEp~pWNQY**w$C$-K`jV-xOn?P_`J-{iBrcvrx+7k_2sCWsjnISwoQ@ltHgWPG z7JZ^AnxVH&cytD_XEB|P$9DqzHW3Yh5uwToa5=WGZV_jX3m7!*sZG99VrzSIt`pNo zOlT|`IaAHbI0#%d-GD@xd98E*+=V1WZx-fTP2rX+>sc{ak~8QJN61JLI^8IDesdco ZvF{TYRK>eKH~9bn002ovPDHLkV1l%5oAdwx diff --git a/mods/snow/textures/snow_sled.png b/mods/snow/textures/snow_sled.png new file mode 100644 index 0000000000000000000000000000000000000000..d34999efa7a7d2af4fb55f8f1c3e1f734c7fc952 GIT binary patch literal 327 zcmV-N0l5B&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.png b/mods/snow/textures/snow_snow.png deleted file mode 100644 index 4290ca42622ef26971ddf6574848586f66dfa562..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 345 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85sBugD~Uq{1qucLG}_)Usv`!?92>C8W$^mHUfoidb&7reRJ34q&;THv1VY{$?&@9*UkrN zpG*4B3SYP^*)A0lJ^gd`PsSbo^VJoW-SW8qOHVrbgr3{pcJTDKlt1l3udN&(W;k6{V3L!} zF52m#Qn-hCFJpg;p_b5}tG1#WE!AJ&s?DAxrsXBiKkw)E)xmNe8Q*`-+Pd!S`X{2N lpH7+>o4o417{6T^!;|9Lqla(LPXKz7!PC{xWt~$(696JFj}rg@ diff --git a/mods/snow/textures/snow_snow_brick.png b/mods/snow/textures/snow_snow_brick.png index 47c85ee4108ad78250c96b513b848855321b9631..c5d640c6ae188a3ddb9f0d294c68cdb8f4d51d47 100644 GIT binary patch delta 303 zcmey(yq{@;WIZzj1A~Sxe=v~B5AX?bm66eumDN#DFi=u5Qc^NjQ880h1tN0|4Qm}8 zM?F1feSJ4$V;>U}UsF>*OUn=|t56%82wU4IC#NK5=VVvcG&i?&FRwgr?>rx$0)PL~ z@bHGn$d;(6*5u@g+jm|$cKiwu+`a$*{fGZRP+z!_{1i3$>|-xqfB*FR!-w*!-!@0Wv~{=badTx6j9^k=Z8Tdc#-;FK z^0jS8wW=q?6NS3j3^P6pF2XskIMF-pr3*m3D=0004qNklKNBmJP6FS5=IQB>O}=d%^PZI@{YtuCLG7*vJu& zdz8ypU|PXQOv@h8E4A@kr8a&OyI4F96hNyD0KS2xMX1*84Pjku5n~!C-!N5l(k668 z>`dC;&E^9tlYbr~(8+LxXyDSK)#Xp2a6~K!fNWfT0000 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=FdxzJ-=u2kpI&FOX=A=e#&4IVb1M5r6JW2{1ke0QmwW z6X)J;o@+7z@!0=o8vjDR@Q=SJTnt~}z_iIuCyB@YGmtMpyKA#&f6F`{0#GP^#jj<- zZ@=dlNoTN~U4mASp1;CGdJek@S~3BT*T3ewgU`{`E8Nb0z+UwcOS5;#{oJPIDKuIe zv^zVNFi@3XP@J@}9`<`8QSXJl>NA{n^E@Pi@jS_ktN7nyf?bAFPYR0}KLAvhQy z+3;DIy2@s_K{&24wB1D=pNf7K4d^_$w@l-Q3dg%H;kIDNh@c=SKC3dbGEDoqgAodI zRJJj~YOr|ovQGBk)p;`JqsmWz~(uC(1Z{a%^GIeCa4EV7&?7la#(G!I6Hx=3N%$g z(=;}I$`OwQG3ySS+q+~&E~6+Ym}MJJN@ge1G*4Vw$1aQ62`;B%?3e0DDM9*#!#azv zPqFsS8$==@%9RFMt!5L}bv)k#AMP&C<4gGBn+=8sV<-v~OBOZD!7y|H>h&gfZ_V-K z={DMX_m}Ct=us-y+0Gr1C|itpW)dB&UfM_Jd+~g>mTYupBl3by}So$UY0?db9 UR$BV(i~s-t07*qoM6N<$g0B^sY5)KL diff --git a/mods/snow/textures/snow_snowball.png b/mods/snow/textures/snow_snowball.png deleted file mode 100644 index 7c90ec760c54597d54bbcb3f13a0ab2fbd6ebff6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 372 zcmV-)0gL{LP)pF2XskIMF-pm0~R$o>>`kM0003KNkl zy;0u(nFuI7R8<6xI7CTTxCdup`AIIVr4?SwGaj2Y{I}`DZa3BXq=PwU-+8`-m%dl+ zIyg5_jcW&TVo5~4+s#QMh$Eu-)N&rqDBS}0c zcyJ!}Q*e=+n(xaPOOi1^0=VDpQdX8&R<8%$wBUZsj{!cvz`1EsS(%z=gx708kR_lm zD*E32V8eDI0NJch-GiFej#tvOh8f<0pJ-W))xznAN_=ep4x311Lf}c(ng48={%pSy$E^}Y SGx>r50000ru})FU^vp5=vq`DiDbZ_}>@Cj@F<~p*c_^`;!76>*7n9D&Cy32_H7Hq`2A#OEVvT(wZ-Fk z+_Y!02El6^b=LY8{$eWKn91iU}`GUKc1vfkIV s`;Kkt^xhG+dYk;B<+;yKw7wUAzUGNu`1!5fKyNd6y85}Sb4q9e09mDv)c^nh diff --git a/mods/snow/textures/snow_star.png b/mods/snow/textures/snow_star.png index b168c2479c62b24ef7fada78e14a472262127418..10125c4963ae1908fc47cb9d74eeb706c59505fb 100644 GIT binary patch delta 333 zcmV-T0kZy_1lbGXYmR32a9IbWszv zb^yA10J?hsx_kk>e*wjZ0>*&=$AkdKi2}!p1I>^G(24-lmIc*}0NIZK*^mI*od(;F z0OF+w=9d8Im;mUS0_dCq=&K0noCE2f2Y@hft_ka<27l|O59_H5?5qgwt_kg~ z3hk~9?XC~)t`P06678-N?XDNu?5&jm0004WQchCQZORBIg0Y<;?O0iD> zGFg0l9-08~dPe=uDFAR^jV}OD>i^7J0A}s&@3?(w0Up;F4CE`o;wKDyr0n2Uf=(Z) fD?9?-E~Iz@vUCUx;rC-r00000NkvXXu0mjf3g3x` delta 526 zcmV+p0`dLb0-OYp8Gi-<001BJ|6u?C00v@9M??Vs0RI60puMM)00009a7bBm000id z000id0mpBsWB>pF2XskIMF-pr5*0TzJ(e;100050Nkl?bMHCuKi}R4W^V&Ctw&BPu0OO`aHbED06{Tr_Fs%nDwV^D z%1$YkEbD8|L%jU z?<|wcg4PWR9)BWsgMx?f4;#35lN`K~24KzUkjwV!-*;xrNhQRu(FX&A&#**g36_=< z$YzA=NQAOT%&XYsi7pg8#O$o#j%(qrChb?Mg6ReQXtyaSnx!G zZ*MUWax=3)6v5f&IziDj*COy=Cycu70tV>x!n9)Z;eY6SEJ=(YC@z}Jl8x2@?vs{y zzFp_#Zb;_og=n`7(fKc~M!QdN{6?9}PM!DupZ>ndw9BWTVqkN%OD+pvwgx2sqMS0f zWW-^q9XnRJ7Lc-&F^Bvb*o$cnycsj3z!?b$fR%vOMQg-nt(&Yl9RU6U8n>m4mu2ks Q00000Ne4wvM6N<$g0>R%`~Uy| diff --git a/mods/snow/textures/snow_star_lit.png b/mods/snow/textures/snow_star_lit.png new file mode 100644 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_xmas_tree.png b/mods/snow/textures/snow_xmas_tree.png index 357406c19ebf8b05af3752499b4f53b79c2472c0..d787d37c36bf547af1551c66708bc508d156160f 100644 GIT binary patch delta 272 zcmV+r0q_2|1FHg%B!BWrL_t(|0b{@gzAthF;r~Dk=Mx7U#K9V&n*PHK0*Mn335E0=EN@B!32COGiWi_W+^*LD+E5IsgCw32;bRa{vGf6951U69E94oEQKA z00(qQO+^RX3=$R*A_&^K*8l(kL`g(JR5;6(Q_D`mKomVwh@=srKob@a6D=Tu<5 z;&b9jEl*uDOMfu6HAiUaghq_(bNe&gHVdoab@At z8mRy#u9($ahK>$)=e@3(CEr!iFq- z0);W@7uxff>~cQ56=5G6;Sk)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 From b056aea0a3f18105a120e7ecb4497d229ad4c5d3 Mon Sep 17 00:00:00 2001 From: HybridDog Date: Sat, 6 Jun 2015 12:06:53 +0200 Subject: [PATCH 3/3] just a little comment --- update_mods.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/update_mods.sh b/update_mods.sh index 2bcbd78..be0caee 100644 --- a/update_mods.sh +++ b/update_mods.sh @@ -32,6 +32,8 @@ for i in $(ls); do trash ../mods/$i mv $i ../mods/$i done + +# remove folder cd .. rm -R tmp